Синтаксична помилка під час розбору рядка JSON

У мене є зразок JSON з деякою частиною моєї веб-сторінки відтворення:

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

Цей рядок повертається з викликом ajax, і jQuery 1.6.1 видає помилку:

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

в наступній частині коду:

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 );
    }

Що мені тут не вистачає?


EDIT:

Я проаналізував попередній "json" (який, до речі, був створений за допомогою simplejson lib python, тому я цікаво, як це може працювати скрізь), і тепер jsonlint показує, що у мене є належний JSON. Проте проблема залишається незмінною. Новий рядок:

{"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: Гаразд, виглядає, що JSOn, що залишає мою бекенда, є правильним, але німий jQuery додає додаткові лапки навколо кожної "" ", яка є незвичайною.

4
Я не знаю, але з вигляду його, схоже, виглядає недійсним ...
додано Автор Rafay, джерело

5 Відповіді

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

function getJSonObject(value) {
    return $.parseJSON(value.replace(/"/ig, '"'));
}
10
додано
8
додано
@JamieRRytlewski Хороший момент. На жаль, я не можу знайти спосіб генерування посилання на певну перевірку, тому я використовував режим JavaScript за ідеєю.
додано Автор phihag, джерело
Ви завжди можете скористатися jsonlint.com , щоб перевірити, чи це дійсно JSON. Крім того, вищенаведене недійсне JSON.
додано Автор Jamie R Rytlewski, джерело

Я можу помилятися тут, але я думаю, що саме через дані JSON він не працює. Синтаксичний аналізатор JSON, ймовірно, затушує подвійні лапки в HTML, що містяться в рядковій змінній JSON'ed. Я думаю, що він буде працювати, коли ви попередньо обробляєте рядок HTML перед виведенням даних JSON, щоб ви змінювали подвійні лапки на щось інше. (і навпаки, після розбору даних JSON)

Приклад може трохи пояснити:

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

Я спробую використати це:

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

Сподіваюся, це допоможе ...

3
додано
це працювало для мене. для спрощення заміни цитування я використав JSON.stringify (foo) .replace (/ \\ "/ g, '\\\\" ")
додано Автор Rahul Gupta-Iwasaki, джерело

JSON = Javascript Object Notation, тому властивість "# data" є недійсним рядком.

You can validate your JSON here

2
додано

Я думаю, що це, мабуть, той факт, що ви використовуєте ті самі подвійні лапки у вашому HTML-коді, тому JSON вважає його властивістю, спробуйте використовувати одинарні кавычки для всього HTML

0
додано
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram