我正在尝试解析从我的Sinatra / DataMapper后端提供的JSON字符串,但是从$.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方法被破坏,否则不应该有),我假设这是一个逃避问题。但是我需要逃脱哪些角色来修复它?
编辑:
我的后端是Sinatra(Ruby),DataMapper作为ORM。 JSON字符串在控制器中以@data = model.to_json
生成,并在视图中以$.parseJSON('#{@data}')
处理。
答案 0 :(得分: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