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)で、ORMとしてDataMapperを使用しています。JSON文字列はコントローラーでとして生成され@data = model.to_json、ビューではとして処理され$.parseJSON('#{@data}')ます。

4

1 に答える 1

5

JSON文字列は十分にエスケープされていません—キーのコンテンツ内の引用符の前に単一のバックスラッシュがあります。descriptionバックスラッシュはJavascript文字列内の特殊記号であるため、実際の文字列で\"はエスケープされていない文字になります。"これらのバックスラッシュは、文字列内でリテラル文字として残るために2倍にする必要があり、有効な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 に答える