jQuery parseJSON错误

时间:2012-10-03 11:19:59

标签: jquery json

我正在尝试解析从我的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}')处理。

1 个答案:

答案 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
相关问题