Parse JSON de JQuery.données sur le succès d'ajax
j'ai du mal à obtenir le contenu de l'objet JSON d'un JQery.appel ajax. Mon appel:
$('#Search').click(function () {
var query = $('#query').valueOf();
$.ajax({
url: '/Products/Search',
type: "POST",
data: query,
dataType: 'application/json; charset=utf-8',
success: function (data) {
alert(data);
for (var x = 0; x < data.length; x++) {
content = data[x].Id;
content += "<br>";
content += data[x].Name;
content += "<br>";
$(content).appendTo("#ProductList");
// updateListing(data[x]);
}
}
});
});
il semble que L'objet JSON soit retourné correctement car "alert (data)" affiche ce qui suit
[{"Id": "1", "Name": "Shirt"}, {"Id": "2", "Name":"Pants"}]
mais quand j'essaie d'afficher L'Id ou le nom sur la page en utilisant:
content = data[x].Id;
content += "<br>";
content += data[x].Name;
content += "<br>";
il retourne "undefined" à la page. Ce que je fais mal?
Merci pour le aider.
9 réponses
les données reviennent en tant que représentation de chaîne de caractères du JSON et vous ne les convertissez pas en objet JavaScript. Réglez le dataType
sur 'json'
pour qu'il soit converti automatiquement.
je vous recommande d'utiliser:
var returnedData = JSON.parse(response);
pour convertir la chaîne JSON (si ce n'est que du texte) en un objet JavaScript.
un des moyens de vous assurer que ce type d'erreur (en utilisant string au lieu de json) n'arrive pas est de voir ce qui est imprimé dans le alert
. Quand vous faites
alert(data)
si data est une chaîne de caractères, elle imprimera tout ce qui est contenu. Cependant si vous imprimez est objet json. vous recevrez la réponse suivante dans l'alerte
[object Object]
Si ce la réponse, alors vous pouvez être sûr que vous pouvez l'utiliser comme un objet json (en ce cas).
ainsi, vous devez d'abord convertir votre chaîne en json, avant de l'utiliser en faisant ceci:
JSON.parse(data)
bien... vous êtes environ 3/4 de la manière là-bas... vous avez déjà votre JSON en texte.
le problème est que vous semblez gérer cette chaîne comme si elle était déjà un objet JavaScript avec des propriétés relatives aux champs qui ont été transmis.
ça ne l'est pas... c'est juste une chaîne de caractères.
requêtes comme " content = data[x].Id; " sont voués à l'échec parce que JavaScript ne trouve pas ces propriétés attachées à la chaîne qu'il est en train de regarder... encore une fois, ce n'est qu'une ficelle.
vous devriez être en mesure de simplement analyser les données comme JSON à travers... yup... la méthode parse de l'objet JSON.
myResult = JSON.parse(request.responseText);
maintenant myResult est un objet javascript contenant les propriétés qui ont été transmises par AJAX.
qui devrait vous permettre de le gérer comme vous semblez essayer de le faire.
ressemble à JSON.parse a été ajouté lorsque ECMA5 a été ajouté, de sorte que tout ce qui est assez moderne devrait être en mesure de gérer cela nativement... si vous devez manipuler des fossiles, vous pouvez aussi essayer des bibliothèques externes, comme jQuery ou JSON2 .
pour rappel, Andy E a déjà répondu à cette question pour quelqu'un d'autre ici .
edit - vu la demande de "sources officielles ou crédibles", et probablement un des codeurs que je trouve le plus crédible serait John Resig ~ ECMA5 JSON ~ j'aurais relié à la spécification ECMA5 réelle concernant le support JSON natif, mais je préférerais renvoyer quelqu'un à un master comme Resig qu'à une spécification sèche.
vous pouvez utiliser la méthode jQuery parseJSON:
var Data = $.parseJSON(response);
c'est le travail, par exemple
.ajax({
url: "http://localhost:11141/Search/BasicSearchContent?ContentTitle=" + "تهران",
type: 'GET',
cache: false,
success: function (result) {
// alert(jQuery.dataType);
if (result) {
// var dd = JSON.parse(result);
alert(result[0].Id)
}
},
error: function () {
alert("No");
}
});
Enfin, vous devez utiliser cette instruction ...
result[0].Whatever
Essayez le jquery each
la fonction de marche par le biais de votre objet json:
$.each(data,function(i,j){
content ='<span>'+j[i].Id+'<br />'+j[i].Name+'<br /></span>';
$('#ProductList').append(content);
});
de l'API jQuery: avec le paramètre dataType
, si aucun n'est spécifié, jQuery tentera de le déduire avec $.parseJSON()
basé sur le type MIME (le type MIME pour le texte JSON est" application/json") de la réponse (dans la version 1.4 JSON donnera un objet JavaScript).
Ou vous pouvez définir la dataType
à json
pour convertir automatiquement.
Je ne suis pas sûr de ce qui va mal avec votre installation. Peut-être que le serveur ne règle pas les en-têtes correctement. Pas sûr. Comme un long shot, vous pouvez essayer ce
$.ajax({
url : url,
dataType : 'json'
})
.done(function(data, statusText, resObject) {
var jsonData = resObject.responseJSON
})