我正在尝试解析从我的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}');
Run Code Online (Sandbox Code Playgroud)
Firebug中出现的错误是:
SyntaxError: JSON.parse: expected ',' or '}' after property value in object
Run Code Online (Sandbox Code Playgroud)
因为我不能在我的生活中看到任何遗漏的','或'}'符号(除非ruby to_json方法被破坏,否则不应该存在),我假设这是一个逃避问题.但是我需要逃脱哪些角色来修复它?
编辑:
我的后端是Sinatra(Ruby),DataMapper作为ORM.JSON字符串在控制器中生成@data = model.to_json
,并在视图中处理$.parseJSON('#{@data}')
.
您的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}');
Run Code Online (Sandbox Code Playgroud)
我怀疑你用这样的伪代码生成你的Javascript代码:
print "var data = $.parseJSON('" + json_string + "')"
Run Code Online (Sandbox Code Playgroud)
引号内的字符串的简单的包装是不足够的,以确保其字面值保持在生成的Javascript代码相同.为了保护字符串免受此类特殊字符问题的影响,通常只需将其包装在一个额外的JSON编码中,而不是用单引号括起来:
print "var data = $.parseJSON(" + json_encode(json_string) + ")"
Run Code Online (Sandbox Code Playgroud)
由于JSON编码生成有效的Javascript数据结构,因此对简单字符串进行JSON编码将生成正确引用的Javascript字符串.但是,公平地说,如果您的JSON来自可信来源,您可以完全跳过中间JSON解码步骤:
print "var data = " + json_string
Run Code Online (Sandbox Code Playgroud)