jQuery ne pas analyser mon JSON à partir d'une requête AJAX
Je vais avoir de la difficulté à l'analyse de certaines données JSON retourné à partir de mon serveur à l'aide de jQuery.ajax()
Pour effectuer l'AJAX j'utilise:
$.ajax({
url: myUrl,
cache: false,
dataType: "json",
success: function(data){
...
},
error: function(e, xhr){
...
}
});
Et si je retourne un tableau d'objets alors qu'il fonctionne très bien:
[ { title: "One", key: "1" }, { title: "Two", key: "2" } ]
Le succès fonction est appelée et reçoit le bon objet.
Cependant, quand je suis en train de retourner un objet unique:
{ title: "One", key: "1" }
La fonction d'erreur est appelé et xhr contient "parsererror'. J'ai essayé d'emballage le JSON dans la parenthèse sur le serveur avant de l'envoyer sur le réseau, mais il ne fait aucune différence. Pourtant, si j'ai coller le contenu dans une chaîne de caractères en Javascript et ensuite utiliser la fonction eval (), il évalue parfaitement.
Les idées de ce que je fais mal?
Anthony
- Connexes: stackoverflow.com/questions/631418/...
Vous devez vous connecter pour publier un commentaire.
Est votre serveur qui envoie les données en tant que Content-Type
"*/json"
? Si non, de modifier les en-têtes de réponse en conséquence. L'envoi de"application/json"
serait bien, par exemple.Selon la json.org spécification, votre retour n'est pas valide. Les noms sont toujours cotés, donc vous devriez être de retour
et
Cela peut ne pas être le problème avec votre installation, puisque vous dites que l'un d'entre eux fonctionne maintenant, mais il doit être fixé pour la correction dans le cas où vous avez besoin pour passer à une autre parser JSON dans l'avenir.
{ key: 'val' }
n'est pas valide JSON.Chaînes JSON sont enveloppés dans double les devis, les apostrophes ne sont pas un substitut valable.
est valide, mais ce n'est pas...
Alors que l'OP du problème, de la pensée, il vaut la peine de noter, pour ceux qui atterrissent ici.
Ce problème est généralement parce que votre demande a reçu le mauvais type mime. Lors de l'élaboration de votre propre ordinateur, parfois, vous ne recevez pas le bon type mime à partir de "serveur", qui est votre propre ordinateur. J'ai rencontré ce problème une fois lors de l'élaboration, par l'ouverture du fichier stocké localement dans le navigateur (par exemple, l'url "c:/project/test.html").
Essayez d'utiliser le beforeSend propriété pour ajouter une fonction de rappel qui remplace le type mime. Cela va tromper le code à traiter avec json malgré le mauvais type mime envoyé par le serveur et reçus par votre code d'appel. Un exemple de code est ci-dessous.
Le bon type mime application/json selon cette question, mais je sais que application/j-fils travaillait quand je l'ai essayé (maintenant il y a plusieurs années). Vous devriez probablement essayer d'application/json premier.
J'ai eu ce problème et pour un peu, j'ai utilisé
pour obtenir les données renvoyées dans un objet. mais ensuite, plus tard, il avait d'autres problèmes à obtenir un "manque d' ) dans la parenthèse' erreur et a trouvé que jQuery a une fonction spécifiquement pour l'évaluation d'une chaîne pour une structure json:
devrait faire l'affaire. C'est en plus d'avoir votre chaîne json dans le format correct de cours..
Si vous êtes en écho à la réponse json et vos en-têtes ne correspondent pas */json ensuite, vous pouvez utiliser le construit en jQuery.parseJSON api pour analyser la réponse.
N'est pas ce que vous en pensez. Comme une expression, elle est un Objet littéral, mais comme une déclaration, c'est:
Malheureusement eval() ne vous donne pas un moyen de spécifier si vous êtes en lui donnant une instruction ou une expression, et il a tendance à deviner tort.
La solution habituelle est en effet d'envelopper rien entre parenthèses avant de l'envoyer à la fonction eval (). Vous dites que vous avez essayé sur le serveur... clairement d'une certaine manière qui n'est pas de passer à travers. Il doit être étanche à dire sur le client, quelle qu'en soit la réception de la XMLHttpRequest réponse:
au lieu de:
tant que la réponse est vraiment l'expression n'est pas un énoncé. (eg. il n'a pas plusieurs, point-virgule, ou-saut de ligne-séparés clauses.)
Vous allez avoir à définir l'en-tête de type de contenu dans votre php comme ceci:
Regarder ces Vidéos pour mieux comprendre....
Référence: http://www.youtube.com/watch?v=EvFXWqEqh6o
Si vous consommez ASP.NET des Services Web à l'aide de jQuery, assurez-vous que vous avez inclus dans votre site web.config:
J'ai eu un problème similaire dans le cas de Firefox 3.5 a bien fonctionné et a analysé mes données JSON mais Firefox 3.0.6 renvoyé un parseerror. S'est avéré que c'était un espace vide au début du JSON qui a causé Firefox 3.0.6 lever une erreur. Retrait de l'espace vide, il fixe
Les techniques de "eval()" et "JSON.parse()" utiliser mutuellement exclusifs formats.
Méfiez-vous, il y a "stringify()" les fonctions qui produisent des "eval" format. Pour l'ajax, il est recommandé d'utiliser le format JSON.
Alors que "eval" intègre l'ensemble du langage JavaScript, JSON utilise seulement un petit sous-ensemble de la langue. Parmi les constructions du langage JavaScript que "eval" doit reconnaître, c'est la "Instruction de bloc" (un.k.un. "composé de déclaration"); qui est une paire ou des accolades "{}" avec certains états à l'intérieur. Mais accolades sont également utilisés dans la syntaxe de l'objet de littéraux. L'interprétation est différenciée par le contexte dans lequel le code s'affiche. Quelque chose qui pourrait ressembler à un littéral d'objet pour vous, mais "eval" la verrez comme une instruction composée.
Dans le langage JavaScript, des littéraux d'objet se trouvent à droite d'une affectation.
Objet littéraux de ne pas se produire sur leur propre.
Revenir à l'OP question d'origine, a demandé en 2008, il a demandé pourquoi je ne parvient pas à "eval()":
La réponse est que cela ressemble à une instruction composée. Pour le convertir en un objet, vous devez le mettre dans un contexte où une instruction composée est impossible. C'est fait en mettant des parenthèses autour d'elle
L'OP a aussi demandé pourquoi une déclaration similaire ne avec succès eval:
La même réponse s'applique -- les accolades sont dans un contexte où une instruction composée est impossible. C'est un tableau contexte, "
[...]
", et les tableaux peuvent contenir des objets, mais ils ne peuvent pas contenir de déclarations.Contrairement à la fonction "eval()", JSON est très limitée dans ses capacités. La limitation est intentionnelle. Le concepteur de JSON prévu minimaliste sous-ensemble de JavaScript, en utilisant uniquement la syntaxe qui pourrait apparaître sur le côté droit d'une affectation. Donc, si vous avez un code qui analyse correctement JSON...
...ce qui implique, elle aussi légalement analyser sur le côté droit d'une affectation, à l'instar de ce..
Mais ce n'est pas la seule restriction sur JSON. Le BNF du langage de spécification pour JSON est très simple. Par exemple, il ne permet pas l'utilisation de guillemets pour indiquer des chaînes de caractères (comme le JavaScript et Perl faire) et il n'y a pas une façon d'exprimer un caractère unique comme un octet (comme C' est le cas). Malheureusement, c'est aussi ne pas autoriser les commentaires (ce qui serait vraiment sympa lors de la création des fichiers de configuration). L'avantage de toutes ces limitations, c'est que le parsing JSON est rapide et n'offre aucune opportunité pour l'injection de code (une menace pour la sécurité).
En raison de ces limitations, JSON a pas l'usage de la parenthèse. Par conséquent, une parenthèse dans une chaîne JSON est un caractère illégal.
Toujours utiliser le format JSON avec l'ajax, pour les raisons suivantes:
Comme un exemple d'ajax pipeline, envisager un programme qui implique un Nœud de serveur et un jQuery client. Le programme client utilise jQuery appel ayant la forme
$.ajax({dataType:'json',...etc.});
. JQuery crée un jqXHR objet pour l'utiliser plus tard, les paquets et envoie la demande connexe. Le serveur accepte la demande, processus, et est alors prêt à répondre. Le programme serveur qui fera appel à la méthoderes.json(data)
à emballer et d'envoyer la réponse. De retour du côté client, jQuery accepte la réponse, consulte les associés jqXHR objet, et le processus des données au format JSON. Tout cela fonctionne sans aucun besoin de manuel de conversion de données. La réponse implique pas d'appel explicite à JSON.stringify() sur le Nœud du serveur, et pas d'appel explicite à JSON.parse() sur le client; que tout est fait pour vous.L'utilisation de "eval" est associée à l'injection de code des risques de sécurité. Vous pourriez penser, il n'existe aucun moyen qui puisse arriver, mais les pirates peuvent obtenir très créatif. Aussi, "eval" est problématique pour Javascript optimisation.
Si vous vous trouvez à l'aide d'un l'aide d'un "stringify()" fonction, sachez que certaines fonctions de ce nom permettra de créer des chaînes de caractères qui sont compatibles avec la fonction "eval" et pas avec JSON. Par exemple, dans le Nœud, le suivant vous donne la fonction qui crée des chaînes dans "eval" format compatible:
Cela peut être utile, mais à moins d'avoir un besoin spécifique, il n'est probablement pas ce que vous voulez.
En cas de retour d'une matrice et de retourner un objet unique qui ne fonctionne pas, vous pouvez également essayer de retourner votre objet unique, comme un tableau contenant qu'un seul objet:
cette façon, vous êtes de retour d'une cohérence structure de données, un tableau d'objets, peu importe la charge utile de données.
je vois que vous avez essayé d'emballage de votre objet unique dans "parenthèse", et de proposer ce à cause par exemple de cours JavaScript traite [ .. ] différemment ( .. )
Si jQuery gestionnaire d'erreur est appelé et le XHR objet contient "erreur d'analyse", c'est probablement une erreur de l'analyseur de retour à partir du serveur.
Est votre résultat plusieurs scénario lorsque vous appelez le service sans paramètre, mais il est en train de briser lorsque vous essayez de fournir un paramètre pour récupérer l'enregistrement unique?
Ce backend sont à vous de retourner auprès de?
Sur ASMX services, par exemple, c'est souvent le cas lorsque les paramètres sont fournis à jQuery comme un objet JSON au lieu d'une chaîne JSON. Si vous fournissez jQuery un véritable objet JSON pour ses "données" paramètre, il va sérialiser en standard & délimité k,v paires au lieu de l'envoyer sous forme de JSON.
J'ai trouvé dans certains de mes implémentations j'ai dû ajouter:
qui semble résoudre le problème. Eval ou pas, il semblait faire exactement la même chose pour moi.
jQuery étouffe sur certains JSON clés. J'ai été l'envoi de cette JSON extrait de code en PHP:
De renommer le "résultat" touche à quelque chose d'autre travaux. Je suppose que c'est un mot réservé de collision d'une certaine sorte, et pourrait être un bug dans jQuery (1.4.2).
Dans un environnement ColdFusion, une chose qui va causer une erreur, même avec bien formé JSON, c'est d'avoir Activer la Demande de Sortie de Débogage activée par l'Administrateur ColdFusion (en vertu de Débogage & exploitation forestière > Debug Paramètres de Sortie). Les informations de débogage sera retourné avec les données JSON et ainsi la rendre invalide.
également essayer cette
dans mon cas, le serveur répond avec unknow caractère before '{'
J'ai été faire état = parseerror et xhr.statut = 200.
La question pour moi était de l'URL à l'intérieur de la réponse JSON avait '\' commutation de '/' fixe cette.
J'ai eu du mal avec cela, et a passé quelques heures à essayer de comprendre cela, jusqu'à ce que j'ai utilisé firebug pour afficher les données de l'objet.
utilisation
sur le côté serveur.
Sur le côté client
utiliser ajax avec le Type de données JSON et assurez-vous que votre encodage du document n'est pas de l'UTF-8 avec BOM il doit être en UTF-8.