2012-03-28 6 views
1

Je suis vraiment nouveau chez JSON, mais voici ce que j'ai obtenu. J'avais besoin de créer un objet qui contient un tableau/liste et quelques champs plats. Par exemple:Création, envoi et désérialisation d'un objet json contenant des tableaux

var names= new Array(); 
    names[0] = "Christy"; 
    names[1] = "Jeremy"; 
var obj = { 
    names: names, 
    age: "21+", 
    comment: "friends" 
}; 

Je puis stringify et tenter de l'envoyer à un pagemethod via AJAX:

var jsonData = JSON.stringify(obj); 
sendData(obj); 

Et puis l'envoi:

function sendData(jsonData) { 
    $.ajax({ 
     type: "POST", 
     url: "Default.aspx/TestArray", 
     data: jsonData, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (msg) { 
      alert('win'); 
     }, 
     error: function (a, b, ex) { 
      alert('fail'); 
     } 
    }); 
} 

donc tous ensemble:

$(document).ready(function() { 
    $("#btnSubmit").click(function (e) { 
     e.preventDefault(); 
     var names = new Array(); 
     names[0] = "Christy"; 
     names[1] = "Jeremy"; 
     var obj = { 
      names: names, 
      age: "21+", 
      comment: "friends" 
     }; 
     var jsonData = JSON.stringify(obj); 
     sendData(jsonData); 
    }); 

    function sendData(jsonData) { 
     $.ajax({ 
      type: "POST", 
      url: "Default.aspx/TestArray", 
      data: jsonData, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (msg) { 
       alert(msg.d); 
      }, 
      error: function (a, b, ex) { 
       alert("oops: " + ex); 
      } 
     }); 
    } 
}); 

Je ne sais pas si je fais ce droit. Il ne va même pas à la webmethod, il va plutôt directement à la fonction d'erreur. Mais juste pour le plaisir de la conversation, voici ce que j'ai dans le behind:

[WebMethod()] 
public static string TestArray(string guids) 
{ 
    Comment cmt = (Comment)JsonConvert.DeserializeObject(guids, typeof(Comment)); 
    return "Winner"; 
} 

Et la classe cours im essayant de désérialiser dans:

public class Comment 
{ 
    public List<string> names { get; set; } 
    public string age { get; set; } 
    public string comment { get; set; } 
} 
+0

Voir [cette réponse] (http: // stackoverflow.com/a/9084625/283366) pour plus d'informations sur l'envoi de données JSON dans le corps du message brut – Phil

Répondre

2

Selon la signature de votre méthode web:

public static string TestArray(string guids) 

vous devez envoyer un seul argument de chaîne alors que vous envoyez un objet JSON complexe entier qui n » t match. Alors:

var jsonData = JSON.stringify({ guids: 'foo bar' }); 

Maintenant, si vous voulez envoyer une utilisation complexe de la structure:

public static string TestArray(Comment comment) 

puis:

var names = new Array(); 
    names[0] = "Christy"; 
    names[1] = "Jeremy"; 
var obj = { 
    names: names, 
    age: "21+", 
    comment: "friends" 
}; 
var jsonData = JSON.stringify({ comment: obj }); 

également dans votre méthode Web ne pas faire de sérialisation JSON/désérialisations. C'est une infrastructure qui est gérée pour vous par le framework. Donc, pour résumer:

[WebMethod] 
public static string TestArray(Comment comment) 
{ 
    return "Winner"; 
} 

puis:

var names = new Array(); 
    names[0] = "Christy"; 
    names[1] = "Jeremy"; 
var obj = { 
    names: names, 
    age: "21+", 
    comment: "friends" 
}; 
var jsonData = JSON.stringify({ comment: obj }); 

$.ajax({ 
    type: "POST", 
    url: "Default.aspx/TestArray", 
    data: jsonData, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (msg) { 
     // Notice the .d property. That's ASP.NET PageMethods 
     // serialize the response. 
     alert(msg.d); 
    }, 
    error: function (a, b, ex) { 
     alert('fail'); 
    } 
}); 

également afin de pouvoir facilement déboguer ces problèmes à l'avenir, je recommande très fortement à l'aide d'un outil de débogage javascript tel que Firebug qui vous montre les éventuelles erreurs js que vous pourriez avoir ainsi que tout le trafic réseau, y compris les requêtes AJAX.

+0

intéressant! Je me suis désérialisé. avernice. Merci! – Sinaesthetic

-1

Vous êtes objet de données JSON n'a pas être stringifié. JQuery crée automatiquement un objet JSON pour elle:

var jsonData = JSON.stringify(obj); 
sendData(jsonData); 

peut-il devenir:

sendData(obj); 

En outre, dans le code derrière vous utilisez JsonConvert de la bibliothèque JSON.Net, .NET dispose également d'un (un peu limité) Analyseur JSON appelé JavaScriptSerializer. De cette façon, vous pouvez utiliser quelque chose comme:

public static string TestArray(string guids) 
{ 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    // Deserialize 
    Comment cmt = serializer.Deserialize<Comment>(guids); 
} 
+0

Si vous faites cela, jQuery publiera un ensemble de paires clé/valeur – Phil

+0

ne fonctionnait toujours pas. "Erreur Interne du Serveur". Si je supprime les champs age et comment de l'objet json et le traite comme une liste dans le webmethod, ça marche find. Mais j'ai besoin du tableau. – Sinaesthetic

Questions connexes