Pourquoi est-ce invalid JSON?
Je vais donc envoyer des données à partir d'un serveur de revenir à une page. Il ressemble JSON valide pour moi, et pourtant, c'est d'être pris/géré par le gestionnaire d'erreur dans mon jQuery.ajax() de l'appel.
C'est le message d'erreur affiché:
Error: Invalid JSON: ({"id":"#settingsResult","payload":"<form id=\"pwd_change_frm\" action=\"post\">\n <div>\n <div>\n <div><\/div>\n <div><label for=\"changepwd_password\">New Password<\/label><\/div>\n <div><input type=\"password\" name=\"changepwd[password]\" title=\"Enter new password\" style=\"width:258px;\" id=\"changepwd_password\" \/><\/div>\n <\/div>\n <div class=\"spacer\"> <\/div>\n <div>\n <div><\/div>\n <div><label for=\"changepwd_password_confirm\">Confirm New Password<\/label><\/div>\n <div><input type=\"password\" name=\"changepwd[password_confirm]\" title=\"Retype new password)\" style=\"width:258px;\" id=\"changepwd_password_confirm\" \/><\/div>\n <\/div>\n <div class=\"spacer\"><\/div>\n <div><img id=\"pwd_chg_btn\" class=\"submit_btn\" src=\"\/images\/button_submit.gif\" alt=\"Button_submit\" \/><\/div>\n <\/div>\n <input type=\"hidden\" name=\"changepwd[_csrf_token]\" value=\"1b7f3529797245c0fc43c3ddf5ade30d\" id=\"changepwd__csrf_token\" \/><\/form>\n<div class=\"spacer\"><\/div>"})
En aparté, FF Firebug analyse correctement les données renvoyées et affiche ot correctement - c'est pourquoi je ne comprends pas pourquoi jQuery ne semble pas possible de le gérer.
voici le morceau de code qui fait l'appel:
jQuery.ajax({
type: 'POST',
url: '/some_url?id='+this.id,
timeout: 2000,
success: function(result){ jQuery(result.id).html(result.payload); },
error: function (xhr, ajaxOptions, thrownError){ alert('Error: '+ thrownError); }
});
- jsonlint.com valide le JSON (j'ai collé sans les parenthèses)
- à l'aide de jq 1.5 1.5.1 ? 1.5 eu quelques bugs peut-être cela est-il? Ils ont fait une révision majeure de l'ajax module, donc je ne serais pas suriprised. Json validateur dit json est ok à ce haussement d'épaules.
- Vous devez avoir résolu depuis que vous avez accepté la réponse, mais à l'aide de jQuery
$.parseJSON()
il a échoué pour moi, même sans le()
. J'ai été en mesure de l'obtenir pour analyser si j'ai enlevé tous les/n
, et remplacé tous les\"
avec\'
.
Vous devez vous connecter pour publier un commentaire.
En raison de l'entoure " ()', l'enlever et de ses json valide.
Probablement inutile de répondre à ce point, mais j'ai juste pensé que je remarque que la question n'est de toute façon semblent être avec
$.parseJSON()
.Si je supprime toutes les occurrences de
\n
, et remplacer toutes les occurrences de\"
avec\'
, il fonctionne.Sinon, si j'ai le double de leur échapper, il fonctionne.
...qui aurait du sens, puisque je crois que jQuery ne fonctionne tout simplement un
eval()
(ou effectivement la même chose), donc je suppose que s'échapper de la"
de la cessation de la chaîne et d'échapper à la\n
est l'introduction d'un caractère de saut de ligne où il serait invalide.Puisque tout le reste semble être valide, le problème est probablement que vous êtes y compris
(
et)
dans les données.L'erreur s'affiche également lorsque vous utilisez jquery validate (version 1.7). Vous pouvez vérifier: http://datatables.net/forums/comments.php?DiscussionID=3993&page=1#Item_16
J'ai également mis à niveau vers jquery 1.5.1 et j'ai eu le même problème. Après j'ai mis à jour jquery validate (à partir d'ici: https://github.com/jzaefferer/jquery-validation) l'erreur a disparu.
Quelle est la réelle JSON qui est passé? La chaîne de caractères dans le message d'erreur:
est valable selon JSONLint. Êtes-vous y compris les parens?
Mise à jour après la Question Changé
Est-il possible que
<\/div>
est en quelque sorte la confusion choses? Ce n'est pas valide en HTML donc je ne sais pas ce quejQuery(result.id).html(result.payload)
va faire avec elle.jquery exige que vous offre "dataType: json", à moins de vous fournir le bon type de contenu dans votre serverside code comme "header('Content-type: application/json');"
Selon json.org
Donc JSON doit commencer par '{' ou '[' et il ne peut pas commencer par" ("
Également que vous utilisez en ligne validateur comme debugjson.com toujours vérifier les erreurs de votre JSON entrée.