2011-10-27 225 views
3

當我有我的網頁的某一部分呈現一個樣本JSON:語法錯誤解析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>"}} 

此字符串與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); 
    } 

什麼我在這裏想念嗎?


編輯:

我已經經歷了之前的「JSON」解析(其中的方式與Python的simplejson lib中創建的,所以我不知道這怎麼能在任何地方工作),現在jsonlint顯示,該我有適當的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/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: 好看起來,這JSON離開我的後臺是正確的,但愚蠢的jQuery的周圍增加了每個「"」,這是有點兒奇怪額外的報價。

+0

我不知道,但是從它的外觀的JSON似乎無效... – Rafay

回答

7

數據是not有效的JSON,因爲\"中的字符串似乎已被替換爲"\

聯繫,理應-JSON的作者,並通知他或她有plentyofJSONlibrariesavailableforalllanguagesandplatforms

+4

您可以隨時使用:http://jsonlint.com/檢查如果它是有效的JSON。另外,以上是無效的JSON。 –

+0

@JamieRRytlewski好點。不幸的是,我找不到一種方法來生成指向特定驗證的鏈接,所以我在ideone上使用了JavaScript模式。 – phihag

0

我認爲這可能是事實,你正在使用這樣的JSON認爲在你的HTML代碼本身相同雙引號的屬性值,嘗試使用單引號所有的HTML

2

我可能會在這裏誤,但我認爲這是由於JSON數據本身不起作用。 JSON解析器可能會在包含在JSON中的字符串變量中的HTML中的雙引號上扼殺。我認爲它會在輸出JSON數據之前預處理HTML字符串時起作用,因此您可以將雙引號更改爲其他字符。 (和做其他方式解析JSON數據後)

一個例子可以澄清一點:

,而不是這樣的: {"html": { "#data": "<input name="somename" type="text"/>"} }

我會嘗試使用此:

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

希望它可以幫助...

+1

這對我有用。爲了簡化引用,我使用了'JSON.stringify(foo).replace(/ \\「/ g,'\\\\'')' –

1

JSON = JavaScript對象Notati因此,"#data"屬性的值是無效的字符串。

您可以驗證您的JSON here

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

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