2

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

4

1 回答 1

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
于 2012-10-03T11:27:53.040 回答