Reputation: 3552
I'm trying to parse a JSON string served up from my Sinatra/DataMapper backend, but am getting an error from $.parseJSON
. The offending line is:
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}');
And the error appearing in Firebug is:
SyntaxError: JSON.parse: expected ',' or '}' after property value in object
Since I can't for the life of me see any missing ',' or '}' symbols (and there shouldn't be unless the ruby to_json method is broken), I'm assuming this is an escaping issue. But which characters do I need to escape to fix it?
EDIT:
My backend is Sinatra (Ruby), with DataMapper as the ORM. The JSON string is being generated in the controller as @data = model.to_json
, and is being handled in the view as $.parseJSON('#{@data}')
.
Upvotes: 2
Views: 5269
Reputation: 43158
Your JSON string is insufficiently escaped — there are single backslashes before the quotes inside the content of the description
key; since backslashes are special symbols inside Javascript strings, \"
results in an unescaped "
character in the actual string. Those backslashes need to be doubled in order to remain as literal characters in the string, making it a valid JSON representation.
This corrected JSON string works as expected:
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}');
I suspect you generate your Javascript code with something like this pseudocode:
print "var data = $.parseJSON('" + json_string + "')"
Simple wrapping of a string inside quotes is not enough to ensure its literal value remains the same in the generated Javascript code. In order to protect the string from such special-character issues, usually it is enough to wrap it in an additional JSON encoding instead of wrapping in single quotes:
print "var data = $.parseJSON(" + json_encode(json_string) + ")"
Since JSON encoding produces valid Javascript data structures, JSON-encoding a simple string will result in a properly quoted Javascript string. Though, to be fair, you might be able to skip the intermediate JSON decoding step altogether, if your JSON comes from a trusted source:
print "var data = " + json_string
Upvotes: 5