Erreur de syntaxe lors de l'analyse de la chaîne JSON

J'ai un exemple de JSON avec une partie de ma page Web rendue:

{"html": {"#data": "\n

Data

\n<div class="\"manufacturer-image\"">\n \n</div>\n
<form action="\"/manage/update-manufacturer-data/3\"" method="\"post\"">\n \n 
<div class="\"field\"">\n <div class="\"label\"">\n :\n 
</div>\n \n \n <div class="\"error\"">\n 
<input id="\"id_name\"" name="\"name\"" maxlength="50" type="\"text\"">\n 
  • Pole wymagane
\n </div>\n \n </div>\n\n 
<div class="\"field\"">\n <div class="\"label\"">\n :\n 
</div>\n \n \n <div>\n <input name="\"image\"" id="\"id_image\"" type="\"file\"">\n 
</div>\n \n </div>\n\n <div class="\"field\"">\n <div class="\"label\"">\n 
:\n </div>\n \n \n <div>\n 

\n </div>\n \n 
</div>\n \n <div class="\"buttons\"">\n <input class="\"ajax-save-button" button\"="" type="\"submit\"">\n 
</div>\n</form>"}}

Cette chaîne est renvoyée avec un 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 j'oublie ici ?


MODIFIER:

J'ai analysé le précédent 'json' (créé par la suite avec simplejson lib de python, je me demande donc comment cela fonctionne-t-il n'importe où) et montre maintenant que jsonlint indique que j'ai le bon JSON. Le problème reste toujours le même. La nouvelle chaîne:

{"html": [{"#data": "\n

Data

\n<div class="manufacturer-image">\n    \n</div>\n<form action="/manage/update-manufacturer-data/4" method="post">\n        \n    <div class="field">\n        <div class="label">\n            :\n        </div>\n        \n        \n            <div class="error">\n                <input id="id_name" type="text" name="name" maxlength="50" />\n                
  • Pole wymagane
\n            </div>\n        \n    </div>\n\n    <div class="field">\n        <div class="label">\n            :\n        </div>\n        \n        \n            <div>\n                <input type="file" name="image" id="id_image" />\n            </div>\n        \n    </div>\n\n    <div class="field">\n        <div class="label">\n            :\n        </div>\n        \n        \n            <div>\n                

\n            </div>\n        \n    </div>\n  \n    <div class="buttons">\n        <input type="submit" class="ajax-save-button button" />\n    </div>\n</form>"}]}

EDIT2: Ok, il semblerait que JSOn quitte mon backend soit correct, mais dumb jQuery ajoute des guillemets supplémentaires autour de chaque "" ', ce qui est plutôt étrange.

4
Je ne sais pas, mais de par son apparence, le JSON semble être invalide ...
ajouté l'auteur Rafay, source

5 Réponses

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

function getJSonObject(value) {
    return $.parseJSON(value.replace(/"/ig, '"'));
}
10
ajouté

Les données sont non valides JSON, car \ " dans les chaînes semble avoir été remplacé par " \ .

Contactez l'auteur de ce soi-disant JSON et informez-le de la abondance de JSON bibliothèques disponibles pour tous langues et plates-formes .

8
ajouté
@JamieRRytlewski Bon point. Malheureusement, je ne trouve pas le moyen de générer un lien vers une validation spécifique. J'ai donc utilisé le mode JavaScript sur ideone.
ajouté l'auteur phihag, source
Vous pouvez toujours utiliser: jsonlint.com pour vérifier si le format JSON est valide. En outre, ce qui précède n'est pas un JSON valide.
ajouté l'auteur Jamie R Rytlewski, source

Je me trompe peut-être ici, mais je pense que cela est dû aux données JSON elles-mêmes. L'analyseur JSON étouffe probablement les guillemets dans le code HTML contenu dans la variable chaîne JSON. Je pense que cela fonctionnera si vous pré-traitez la chaîne HTML avant de générer les données JSON afin de changer les guillemets en quelque chose d'autre. (et faire l'inverse après avoir analysé les données JSON)

Un exemple pourrait clarifier un peu:

instead of this: {"html": { "#data": "<input name="somename" type="text"/>"} }

J'essaierais d'utiliser ceci:

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

J'espère que ça aide...

3
ajouté
cela a fonctionné pour moi. pour simplifier le remplacement de devis, j’ai utilisé JSON.stringify (foo) .replace (/ \\ "/ g, '\\\\"')
ajouté l'auteur Rahul Gupta-Iwasaki, source

JSON = Notation d'objet Javascript, par conséquent, la valeur de la propriété "# data" est une chaîne non valide.

You can validate your JSON here

2
ajouté

Je pense que c'est probablement le fait que vous utilisez les mêmes guillemets dans votre code HTML lui-même, de sorte que le JSON considère qu'il s'agit d'une valeur de propriété. Essayez d'utiliser des guillemets simples pour tout le code HTML.

0
ajouté