7

動的 JSON の例を以下にいくつか示します。問題があるのは、JSON.parse または Jquery.parseJSON によって適切に処理されるように、すべてを適切にエスケープすることですが、何らかの理由で現在そうではありません。すべての引用符を置き換えてみましたが、何も解決しません...

var Json = '{"resolved_id":"244296544","resolvedUrl":"http:\/\/www.engadget.com\/2012\/11\/01\/windows-phone-for-mac\/","host":"engadget.com","title":"Windows Phone 7 Connector for Mac updated for WP8, rebranded simply as \'Windows Phone\'","datePublished":"2012-11-01 04:49:00","timePublished":1351763340,"responseCode":"200","excerpt":"For Mac users who prefer Microsoft as their mobile partner, Windows Phone 7 Connector has been the one bridging the divide so far. The sync app has just been updated to v3.0, gaining support for Windows Phone 8 and a concise new name -- \"Windows Phone\" -- to match its Windows 8 counterpart.","authors":{"5437327":{"author_id":"5437327","name":"Deepak Dhingra","url":"http:\/\/www.engadget.com\/editor\/deepak-dhingra"}},"images":{"1":{"item_id":"244296544","image_id":"1","src":"http:\/\/www.blogcdn.com\/www.engadget.com\/media\/2012\/11\/win-phone-for-mac-1351752168.jpg","width":"0","height":"0","credit":"","caption":""}},"videos":"","wordCount":116,"isArticle":1,"isVideo":0,"isIndex":0,"usedFallback":0,"article":"\n<a href=\"http:\/\/www.engadget.com\/2012\/11\/01\/windows-phone-for-mac\/\" nodeIndex=\"493\"><img src=\"http:\/\/www.blogcdn.com\/www.engadget.com\/media\/2012\/11\/win-phone-for-mac-1351752168.jpg\" \/><span class=\"ril_caption\"> <cite><\/cite><\/span><\/a>\n<p nodeIndex=\"91\" scoreAddedToParent=\"37\">For Mac users who prefer Microsoft as their mobile partner, <a href=\"http:\/\/www.engadget.com\/2011\/08\/31\/windows-phone-7-mango-will-play-nicer-with-macs-update-your-con\/\" nodeIndex=\"495\">Windows Phone 7 Connector<\/a> has been the one bridging the divide so far. The sync app has just been updated to v3.0, gaining support for <a href=\"http:\/\/www.engadget.com\/2012\/10\/29\/windows-phone-8-review\/\" nodeIndex=\"496\">Windows Phone 8<\/a> and a concise new name -- \"Windows Phone\" -- to match its <a href=\"http:\/\/www.engadget.com\/2012\/10\/29\/microsft-adds-windows-phone-app-to-windows-store\/\" nodeIndex=\"497\">Windows 8 counterpart<\/a>. The new app plays well with <a href=\"http:\/\/www.engadget.com\/tag\/RetinaMacbookPro\/\" nodeIndex=\"498\">Retina Macs<\/a> too, while other goodies in the changelog include drag-and-drop capability for transferring files in either direction, along with support for iPhoto 9.3.2 and Aperture 3.3.2. Incoming WP8 devices such as the <a href=\"http:\/\/www.engadget.com\/2012\/10\/29\/htc-8x-review-windows-phone-8s-compact-flagship\/\" nodeIndex=\"499\">HTC 8X<\/a> and the <a href=\"http:\/\/www.engadget.com\/2012\/10\/04\/nokia-lumia-920-for-atandt-hands-on-a-windows-phone-8-flagship-wi\/\" nodeIndex=\"500\">Lumia 920<\/a> will also get enhanced ringtone features and allow battery life to be monitored via the app. Persuaded? Then collect your goods at the source link below.<\/p>\n\n"}';
4

4 に答える 4

5

JSON 内では、文字列内の引用符はバックスラッシュでエスケープする必要があります: {"key": "prop with \" quote"}.

JavaScript 内では、文字列リテラル内の引用符とバックスラッシュはバックスラッシュでエスケープする必要があります: "string with \\backslash and \" quote".

本当に JS 文字列リテラルで JSON を使用する必要がある場合 (そうする理由はありません)、それらを二重にエスケープする必要があります: json = "{\"key":\"prop with \\\" quote and \\n linebreak\"}". 「Windows Phone」に関する引用については、そうしていません。

しかし、そのような問題に対処するとき、あなたは何か間違ったことをしたに違いありません。通常、JSON 文字列は ajax 呼び出しなどから取得しますが、既に文字列値として取得しています。サーバーで作成された JSON を js スクリプトに直接エコーする場合、文字列リテラルでラップする必要はありません。既に[ほぼ]有効なオブジェクト リテラル構文です。

于 2012-11-01T15:46:21.940 に答える
1

あなたの問題はJson、開始と終了の引用符のために、おそらくオブジェクト全体が 1 つの文字列にすぎないことです。JSON の考え方は、次のように複雑な変数を 1 つのオブジェクトに割り当てることです。

var Json = {
  "resolved_id": "244296544",
  ...
}

また、スラッシュをエスケープする必要はありません。

于 2012-11-01T15:46:44.187 に答える
0

最後まで:

'...\n\n"}';

バックスラッシュをエスケープします。

'...\\n\\n"}';
于 2012-11-01T15:42:03.050 に答える
0

JSONLintによると、問題は次の行にあります。

"title": "Windows Phone 7 Connector for Mac updated for WP8, rebranded simply as \'Windows Phone\'",

' のバックスラッシュを削除すると、検証されます。JSONでは、' をエスケープしません

残念ながら、' を使用して文字列を区切っているため、エスケープする別の方法を見つける必要があります。\' の代わりに \u0027 を使用できます。

于 2012-11-01T15:47:32.073 に答える