2012-10-03 49 views
2

我想解析從我的Sinatra/DataMapper後端服務的JSON字符串,但是從$.parseJSON得到錯誤。該問題的行是:jQuery parseJSON錯誤

var data = $.parseJSON('{"id":1249,"ssid":"asdf","mac_addr":"12:34:56:78:90:12","description":"<a href=\"http://www.google.com\">Google</a>","gps_lat":"53.345036547354","gps_lng":"-6.2576787407226675","location":"","authentication_method":"WPA2-PSK","password":"","xml_id":"default","access_network_area_id":37}'); 

而且出現在Firebug的錯誤是:

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

既然我不能爲我的生命看到任何失蹤「」或‘}’符號(和除非ruby to_json方法被破壞,否則不應該存在),我假設這是一個轉義問題。但我需要逃脫哪些字符才能修復它?

編輯:

我的後臺是西納特拉(紅寶石),與DataMapper的的ORM。 JSON字符串正在控制器中生成爲@data = model.to_json,正在視圖中處理爲$.parseJSON('#{@data}')

回答

5

您的JSON字符串沒有足夠的轉義 - 有單個description鍵內容的引號之前的反斜槓;由於反斜槓是Javascript字符串中的特殊符號,因此\"會導致實際字符串中出現未轉義的"字符。這些反斜槓需要加倍才能保留字符串中的文字字符,使其成爲有效的JSON表示。

該修正JSON字符串按預期工作:

var data = $.parseJSON('{"id":1249,"ssid":"asdf","mac_addr":"12:34:56:78:90:12","description":"<a href=\\"http://www.google.com\\">Google</a>","gps_lat":"53.345036547354","gps_lng":"-6.2576787407226675","location":"","authentication_method":"WPA2-PSK","password":"","xml_id":"default","access_network_area_id":37}'); 

我懷疑你有這樣的僞代碼生成JavaScript代碼:

print "var data = $.parseJSON('" + json_string + "')" 

引號之內的字符串的簡單包裝是足以確保它的字面值在生成的Javascript代碼中保持不變。爲了保護該字符串從這樣的特殊字符的問題,通常它足以把它包在一個額外的JSON編碼而不是包裝的在單引號:

print "var data = $.parseJSON(" + json_encode(json_string) + ")" 

由於JSON編碼產生有效的JavaScript數據結構,對簡單字符串進行JSON編碼將產生正確引用的JavaScript字符串。不過,說句公道話,你也許可以完全跳過中間JSON解碼步驟,如果你的JSON來自可信來源:

print "var data = " + json_string 
+0

是的,你是對的,額外的JSON解碼是不必要的。不知道爲什麼我把它放在那裏首先,謝謝。 –