2010-04-13 5 views
2

J'appelle un service Web et en retournant les données suivantes en format JSON:Problème avec JSON et jQuery

[{"OrderNumber":"12345","CustomerId":"555"}] 

Dans mon service Web méthode de succès, je suis en train d'analyser les deux:

$.ajax({ 
    type: "POST", 
    url: "MyService.asmx/ServiceName", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
     var data = msg.d; 
     var rtn = ""; 

     $.each(data, function(list) { 
      rtn = rtn + this.OrderNumber + ", " + this.CustomerId + "<br/>"; 
     }); 

     rtn = rtn + "<br/>" + data; 

     $("#test").html(rtn); 
     } 
    }); 

mais je reçois un tas de lignes "non définies, non définies" suivies de la chaîne JSON correcte. Une idée pourquoi? J'ai essayé d'utiliser la méthode eval() mais cela n'a pas aidé car j'ai reçu un message d'erreur disant que '] était attendu.

+0

J'ai coupé une partie de la réponse car il est de retour un tableau d'enregistrements avec plus de champs que j'ai énumérés ci-dessus. –

+0

Si je cours ce qui suit au lieu de simplement var data = msg.d: var data = eval ("(" + msg + ")"); Je reçois ceci: ligne: 21 Erreur: attendu « ] » –

+0

Qu'advient-il si vous prenez ce que vous avez à ce jour, mais utilisez 'des données var = msg;' (prendre la '.d')? – salathe

Répondre

0

J'ai finalement obtenu ce travail en faisant ceci:

var data = eval('(' + msg.d + ')'); 

Je suis sûr que ce n'est pas génial, mais ça fonctionne. Si quelqu'un peut fournir une raison pour laquelle cela fonctionne et/ou une solution à mon problème, je l'apprécierais toujours.:)

+1

si cela fonctionne, mais pas 'data = msg.d', alors' msg.d' est une chaîne et non un objet. Vérifiez cela par 'alert (typeof msg.d)'. si cela alerte 'string' et pas' object', cela explique tout. dans ce cas, je risquerais que vous fassiez quelque chose de mal du côté du serveur (eh oui, même supposition que dans mon commentaire le plus récent à ma propre réponse). Je devine que votre webmethod ressemble à ceci 'chaîne publique Abc() {... return JavaScriptSerializer.Serialize (myObject); } ', à la place, si vous le changez en' public Abc() {... return myObject; } ', votre' msg.d' devrait être un objet javascript et non une chaîne. –

+0

Cela a du sens David. Je pensais que vous deviez sérialiser l'objet en le renvoyant bien? –

+0

nah, si vous le renvoyez en tant qu'objet, il sera sérialisé automatiquement. (et * désérialisé * automatiquement côté serveur).c'est pourquoi ce que vous faites finit avec un objet sérialisé deux fois, de sorte que quand vous recevez msg.d automatiquement désérialisé (une fois) c'est toujours une chaîne =) –

0

Je peux me tromper, mais pourrait-il être ceci:

rtn = rtn + list.OrderNumber + ", " + list.CustomerId + "<br/>"; 

HTH

+0

Non. Déjà essayé ça. –

0

Je ne sais pas si je manque quelque chose, mais si vous MSG.D alerte est la valeur indéfinie? Je pensais que le premier paramètre du rappel de succès était les données elles-mêmes. Donc, il pourrait juste être ...

msg.OrderNumber + ", ", + msg.CustomerId; 

Si c'est un tableau, alors ce serait comme la réponse de Raja.

$.each(data, function(list, item) { 
    rtn = rtn + item.OrderNumber + ", " + item.CustomerId + "<br/>"; 
}); 
+0

Il affiche la chaîne JSON correcte lorsque je fais une alerte. En outre, c'est un tableau. Je l'ai changé comme Raja l'a mentionné et ça n'aide pas (encore). –

+0

Avez-vous également essayé d'utiliser le deuxième paramètre dans le rappel $ .each? Le premier est l'index, le second est la valeur. Voir mon édition ci-dessus .... –

+0

Je reçois OrderNumber est nul ou pas un objet. –

1

Lorsque vous faites votre each() vous obtenez probablement toutes les bonnes valeurs. Mais immédiatement après cela, vous concaténuez data, qui est l'objet de réponse entier (res.d.), dans la chaîne. Je ne vois pas comment cela pourrait être ce que vous voulez. Les objets complexes tels que ceux que vous pouvez parcourir avec $.each() peuvent rarement être raisonnablement représentés par des chaînes en les concaténant simplement dans une chaîne existante. Donc, cela devrait causer certaines de vos données fausses. En dehors de cela, je trouve plutôt déconcertant que vous receviez des erreurs lorsque vous essayez d'évaluer les valeurs. Je ne pense pas que vous devriez jamais avoir besoin de recourir à une solution eval, mais néanmoins, vous devriez être capable à eval vos données. Si vous ne pouvez pas, il y a quelque chose de mal mal formé dans votre réponse. Si eval(myVar) indique qu'il attend un ], alors vous voudriez alerter myVar et nous donner la pleine valeur de cela.

+0

Voici la valeur de ma réponse actuelle: [{"StreetAddress1": "123 Main St", "BusinessName": "ABC Inc", "OrderNumber": "987654"}, {"RueAdresse1": "75 Main St", "BusinessName ":" Google "," OrderNumber ":" 654321 "}, {" StreetAddress1 ":" 27 Main St "," BusinessName ":" Microsoft "," OrderNumber ":" 123456 "}] Ceci est en train d'être rendus par en utilisant JavaScriptSerializer() de ASP.NET 3.5. Méthode Serialize(). –

+0

Je suis d'accord que cette ligne rtn = rtn + "
" + data; est un peu étrange. –

+0

Si je sors cette ligne, même erreur. –

0

En supposant que vous utilisez l'entrée comme

[{ "StreetAddress1": "123 Main St", "BusinessName": "ABC Inc", "OrderNumber": "987654"}, { » StreetAddress1 ":" 75 Main St "," BusinessName ":" Google "," Numéro de commande ":" 654321 "}, {" StreetAddress1 ":" 27 Main St "," BusinessName ":" Microsoft "," OrderNumber ":" 123456 "}]

  1. eval (msg) doit être utilisé. ne sais pas pourquoi vous utilisez MSG.D
  2. this.CustomerID renverra non défini, car il n'y a pas customerID dans la réponse JSon
+0

C'est parce que j'ai changé le tableau pour éliminer les informations clientID et les autres valeurs. Je l'ai fait passer à eval. –

0

Quelle ironie est-ce .. J'ai connu le même problème il ya quelque temps ... Cela a fonctionné dans mon cas.

function BuildTable(msg) { 
var table = '<table><thead><tr><th>First Name</th><th>Middle Name</th><th>Last  Name</th></thead><tbody>'; 
for (var i = 0, l = msg.length; i < l; i++) 
{ 
    var person = msg[i]; 
    var row = '<tr>'; 
    row += '<td>' + person.FirstName + '</td>'; 
    row += '<td>' + person.MiddleName + '</td>'; 
    row += '<td>' + person.LastName + '</td>'; 
    row += '</tr>'; 
    table += row; 
} 
table += '</tbody></table>'; 
$('#Container').html(table); 
} 

link text