Comment interpréter JSON renvoyé par jQuery.ajax à l'aide d'une action POST?

StackOverflow https://stackoverflow.com/questions/612515

  •  03-07-2019
  •  | 
  •  

Question

J'ai le code jQuery suivant:

$.ajax({
    type: "POST",
    url: "Services/MyService.asmx/Select",
    dataType: "json",
    data: "{'data':'test'}",
    contentType: "application/json; charset=utf-8",
    success: function(msg){ 
                alert(msg); 
             },
    error: function(xhr){ alert(xhr.statusText);}                
});

L'appel à la méthode retourne ce qui suit:

"{"FirstName":"James"}"

Lorsque je récupère la valeur, mon alerte renvoie la chaîne json complète. Si j'essaie de faire alert (msg.FirstName) , j'obtiens "non défini".

J'ai vu beaucoup d'exemples utilisant la méthode getJSON (); Cependant, je n'ai pas vu de moyen d'utiliser cela pour un verbe POST. Quelqu'un peut-il m'indiquer dans la bonne direction où je me trompe? Selon la documentation de jquery, la valeur de retour doit être identique à dataType (json), de sorte que je ne suis pas certain de ce qui me manque.

EDIT: J'ai regardé sur mon service et ce sont des exemples correspondants que je trouve en termes de signature de méthode renvoyant une chaîne. J'ai également confirmé que le type de réponse est application / json.

EDIT2: Mise à jour de la réponse pour inclure les guillemets extérieurs. J'utilise également un convertisseur JavaScript personnalisé pour effectuer la sérialisation JSON. Le convertisseur personnalisé prend uniquement les propriétés de mon objet (dans ce cas, FirstName) et le charge ainsi que sa valeur dans une collection de dictionnaires que les extensions ASP.Net AJAX v1.0 peuvent sérialiser facilement.

EDIT3: En examinant le problème que j'avais avec eval () (cela a provoqué une erreur Expected " ;; ), j'ai remarqué que les noms de propriété json étaient également entre guillemets. Une fois que j'ai supprimé les guillemets du nom de la propriété (pas la valeur), eval () a fonctionné à nouveau. En regardant maintenant le côté serveur de ce problème.

Était-ce utile?

La solution

L'utilisation de jQuery .ajax semble solide. Comment vérifiez-vous les données retournées? Pyromane? Violoneux? Parce que les services Web .asmx ne renvoient pas de données telles que {" FirstName ": " James "}} . Les réponses ressemblent davantage à:

{"d":{"FirstName":"James"}}

(Voir http: //encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/ )

Pour votre rappel succès , essayez:

function(res) { alert(res.d.FirstName) }

Modifier : Vos mises à jour et vos commentaires concernant la version 1.0 du site ASP.Net AJAX sont

.

Je ne suis pas sûr du fonctionnement de la version 1.0 par rapport à la sérialisation de votre réponse, mais si vous créez votre propre sérialisation JSON personnalisée dans votre méthode WebService, il se peut que la réponse reçoive à nouveau la numérisation JSON . Donc, vous sérialisez deux fois.

Je crois que tous les composants que vous utilisez font ce qu'ils sont censés faire. Il faut que votre rappel success doive être désérialisé manuellement car vous effectuez une sérialisation manuelle sur le serveur:

function(res) {
    res = eval('(' + res + ')');
    alert(res.FirstName);
}

Autres conseils

IIRC vous pouvez évaluer la chaîne et le résultat sera l'objet json.

myJSON = eval (jsonString);

Vous pouvez définir vos variables de publication avec un objet JSON comme second paramètre.

Exemple:

$.getJSON("service.py",
    { foo: bar },
    function(data) {
        $.each(data, function() { // blah });
    }
);

EDIT: Je vois ce que vous voulez dire maintenant. Votre service renvoie-t-il "quelque chose / json"? en tant que type MIME? Si vous consultez les en-têtes de réponse dans Firebug, cela devrait ressembler à ceci:

Content-Type    application/json; charset=utf-8

essayez quelque chose comme ça:

 result = eval('(' + result.d + ')');

Vous ne pouvez pas utiliser $ getJSON avec les services ASMX sérialisés via System.Web.Extensions . Vous effectuez l'appel correctement avec $. Ajax () .

Avez-vous essayé d'utiliser Firebug pour définir un point d'arrêt dans le gestionnaire de réussite et inspecter la valeur msg ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top