Syntaxisfout bij het parseren van JSON-tekenreeks

Ik heb een voorbeeld van JSON waarbij een deel van mijn webpagina is weergegeven:

{"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>"}}

Deze tekenreeks wordt geretourneerd met een ajax-aanroep en jQuery 1.6.1 geeft een foutmelding:

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

in het volgende deel van de 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 );
    }

Wat mis ik hier?


BEWERK:

Ik heb de vorige 'json' (die trouwens met python's simplejson lib gemaakt was) geparseerd, dus ik vraag me af hoe dit overal kan werken) en nu laat jsonlint zien dat ik de juiste JSON heb. Toch blijft het probleem hetzelfde. De nieuwe string:

{"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, het lijkt erop dat JSOn mijn backend verlaat, is correct, maar domme jQuery voegt extra aanhalingstekens toe rond elke '' 'wat nogal vreemd is.

4
ik weet het niet, maar uit het uiterlijk lijkt de json ongeldig ...
toegevoegd de auteur Rafay, de bron

5 antwoord

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

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

De gegevens zijn niet geldig voor JSON, omdat \ " in strings lijkt te zijn vervangen door " \ .

Neem contact op met de auteur van dat zogenaamd-JSON en stel hem of haar op de hoogte dat er voldoende is of JSON bibliotheken beschikbaar voor alle talen en platforms .

8
toegevoegd
@JamieRRytlewski Goed punt. Helaas kan ik geen manier vinden om een ​​link naar een specifieke validatie te genereren, dus heb ik de JavaScript-modus op ideone gebruikt.
toegevoegd de auteur phihag, de bron
U kunt altijd: jsonlint.com gebruiken om te controleren of het JSON is. Ook is het bovenstaande niet geldig JSON.
toegevoegd de auteur Jamie R Rytlewski, de bron

Ik vergis me misschien hier, maar ik denk dat het komt door de JSON-gegevens zelf, maar het werkt niet. De JSON-parser verstikt waarschijnlijk de dubbele aanhalingstekens in de HTML-code in de JSON'ed-tekenreeksvariabele. Ik denk dat het zal werken als je de HTML-string vooraf bewerkt voordat je de JSON-gegevens uitvoert, zodat je de dubbele aanhalingstekens in iets anders verandert. (en omgekeerd na het parseren van de JSON-gegevens)

Een voorbeeld kan een beetje ophelderen:

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

ik zou dit willen gebruiken:

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

Hoop dat het helpt...

3
toegevoegd
dit werkte voor mij. om het vervangen van de offerte te vereenvoudigen, gebruikte ik JSON.stringify (foo) .replace (/ \\ "/ g, '\\\\' ')
toegevoegd de auteur Rahul Gupta-Iwasaki, de bron

JSON = Javascript Object Notation, daarom is de waarde van de eigenschap "# data" een ongeldige tekenreeks.

You can validate your JSON here

2
toegevoegd

Ik denk dat het waarschijnlijk het feit is dat je dezelfde dubbele aanhalingstekens gebruikt in je HTML-code zelf, dus de JSON denkt dat het een eigenschapswaarde is, probeer enkele aanhalingstekens te gebruiken voor alle HTML

0
toegevoegd