2011-10-27 4 views
3

J'ai un échantillon JSON avec une partie de ma page web rendu:Erreur de syntaxe lors de l'analyse chaîne JSON

{"html": {"#data": "\n<h2>Data</h2>\n<div class="\&quot;manufacturer-image\&quot;">\n \n</div>\n 
<form action="\&quot;/manage/update-manufacturer-data/3\&quot;" method="\&quot;post\&quot;">\n \n 
<div class="\&quot;field\&quot;">\n <div class="\&quot;label\&quot;">\n <label for="\&quot;id_name\&quot;">Nazwa</label>:\n 
</div>\n \n \n <div class="\&quot;error\&quot;">\n 
<input id="\&quot;id_name\&quot;" name="\&quot;name\&quot;" maxlength="50" type="\&quot;text\&quot;">\n 
<ul class="\&quot;errorlist\&quot;"><li>Pole wymagane</li></ul>\n </div>\n \n </div>\n\n 
<div class="\&quot;field\&quot;">\n <div class="\&quot;label\&quot;">\n <label for="\&quot;id_image\&quot;">Zdjecie</label>:\n 
</div>\n \n \n <div>\n <input name="\&quot;image\&quot;" id="\&quot;id_image\&quot;" type="\&quot;file\&quot;">\n 
</div>\n \n </div>\n\n <div class="\&quot;field\&quot;">\n <div class="\&quot;label\&quot;">\n 
<label for="\&quot;id_description\&quot;">Opis</label>:\n </div>\n \n \n <div>\n 
<textarea id="\&quot;id_description\&quot;" rows="10" cols="40" name="\&quot;description\&quot;"></textarea>\n </div>\n \n 
</div>\n \n <div class="\&quot;buttons\&quot;">\n <input class="\&quot;ajax-save-button" button\"="" type="\&quot;submit\&quot;">\n 
</div>\n</form>"}} 

Cette chaîne est retourné avec appel ajax et jQuery 1.6.1 génère une erreur:

SyntaxError: JSON.parse: expected ',' or '}' after property value in object

dans la partie suivante du code:

parseJSON: function(data) { 
    if (typeof data !== "string" || !data) { 
     return null; 
    } 
    // Make sure leading/trailing whitespace is removed (IE can't handle it) 
    data = jQuery.trim(data); 

    // Attempt to parse using the native JSON parser first 
    if (window.JSON && window.JSON.parse) { 
     console.warn('data: ', data); 
     var ret; 
     try{ 
      ret = window.JSON.parse(data); 
     } catch(e){ 
      ret = {}; 
      console.warn(e); 
     } 
     return ret; 
     //return window.JSON.parse(data); 
    } 

Qu'est-ce que suis-je manquant ici?


EDIT:

J'ai analysés et traités par la précédente « json » (qui, par la voie a été créé avec la lib simplejson de python, donc je me demande comment cela peut-il travailler partout) et maintenant montre jsonlint, que J'ai un bon JSON. Le problème reste le même. La nouvelle chaîne:

{"html": [{"#data": "\n<h2>Data</h2>\n<div class=&quot;manufacturer-image&quot;>\n \n</div>\n<form action=&quot;/manage/update-manufacturer-data/4&quot; method=&quot;post&quot;>\n  \n <div class=&quot;field&quot;>\n  <div class=&quot;label&quot;>\n   <label for=&quot;id_name&quot;>Nazwa</label>:\n  </div>\n  \n  \n   <div class=&quot;error&quot;>\n    <input id=&quot;id_name&quot; type=&quot;text&quot; name=&quot;name&quot; maxlength=&quot;50&quot; />\n    <ul class=&quot;errorlist&quot;><li>Pole wymagane</li></ul>\n   </div>\n  \n </div>\n\n <div class=&quot;field&quot;>\n  <div class=&quot;label&quot;>\n   <label for=&quot;id_image&quot;>Zdjecie</label>:\n  </div>\n  \n  \n   <div>\n    <input type=&quot;file&quot; name=&quot;image&quot; id=&quot;id_image&quot; />\n   </div>\n  \n </div>\n\n <div class=&quot;field&quot;>\n  <div class=&quot;label&quot;>\n   <label for=&quot;id_description&quot;>Opis</label>:\n  </div>\n  \n  \n   <div>\n    <textarea id=&quot;id_description&quot; rows=&quot;10&quot; cols=&quot;40&quot; name=&quot;description&quot;></textarea>\n   </div>\n  \n </div>\n \n <div class=&quot;buttons&quot;>\n  <input type=&quot;submit&quot; class=&quot;ajax-save-button button&quot; />\n </div>\n</form>"}]} 

EDIT2: Ok, il semble que JSON quitter mon back-end est correct mais jQuery stupide ajoute des citations supplémentaires autour de chaque « " » qui est un peu bizarre.

+0

je ne sais pas, mais le regard de celui-ci le JSON semble être invalide ... – Rafay

Répondre

7

Les données sont not JSON valide, puisque \" dans les chaînes semble avoir été remplacé par "\.

Contactez l'auteur de cette soi-disant-JSON et lui indiquer qu'il ya plentyofJSONlibrariesavailableforalllanguagesandplatforms.

+4

Vous pouvez toujours utiliser: http://jsonlint.com/ pour vérifier si c'est JSON valide. En outre, ce qui précède n'est pas valide JSON. –

+0

@JamieRRytlewski Bon point. Malheureusement, je n'arrive pas à trouver un moyen de générer un lien vers une validation spécifique, j'ai donc utilisé le mode JavaScript sur ideone. – phihag

0

Je pense qu'il est probablement le fait que vous utilisez les mêmes guillemets dans votre code HTML lui-même de sorte que le JSON pense sa valeur de propriété, essayez d'utiliser des guillemets simples pour tout le HTML

2

je pourrais me tromper ici, mais Je pense que c'est parce que les données JSON elles-mêmes ne fonctionnent pas. L'analyseur JSON s'étouffe probablement sur les guillemets dans le code HTML contenu dans la variable de chaîne JSON. Je pense que cela fonctionnera quand vous prétraitez la chaîne HTML avant de sortir les données JSON afin de changer les guillemets doubles en quelque chose d'autre. (Et faire l'inverse après avoir analysé les données JSON)

Un exemple pourrait clarifier un peu:

au lieu de ceci: {"html": { "#data": "<input name="somename" type="text"/>"} }

je vais essayer d'utiliser ceci:

{"html": { "#data": "<input name=&quot;somename&quot; type=&quot;text&quot;/>"} }

Hope it helps ...

+1

cela a fonctionné pour moi. pour simplifier le remplacement de la citation j'ai utilisé 'JSON.stringify (foo) .replace (/ \\"/g, '\\\\ "')' –

1

JSON = Javascript Object Notati Sur, la valeur de la propriété "#data" est une chaîne non valide.

Vous pouvez valider votre JSON here

8
storejson= getJSonObject("@ViewBag.JsonData"); 

function getJSonObject(value) { 
    return $.parseJSON(value.replace(/&quot;/ig, '"')); 
}