5
console.log(JSON.parse('{"data":"{\"json\":\"rocks\"}"}'));

エラーが発生します (Firefox および Chrome のコンソールでテスト済み)。これは JSON.parse のバグですか? PHPでテストすると、同じデコードがうまくいきます。

print_r(json_decode('{"data":"{\"json\":\"rocks\"}"}', true));
4

5 に答える 5

12

この文字列は、PHPとJSで異なる方法で処理されます。つまり、異なる結果が得られます。

PHPで一重引用符で囲まれた文字列のエスケープシーケンスは、\\とだけ\'です。ドキュメントによると、他のすべては文字通り出力されます:

リテラルの一重引用符を指定するには、円記号()でエスケープします\。リテラルの円記号を指定するには、それを2倍にします(\\)。バックスラッシュの他のすべてのインスタンスは、文字通りのバックスラッシュとして扱われます。これは、\rまたはなど、慣れている他のエスケープシーケンスが\n、特別な意味を持つのではなく、指定されたとおりに文字通り出力されることを意味します。

一方、JSでは、文字列に無効なエスケープシーケンスが含まれている場合、バックスラッシュは破棄されます(CV文字値を意味します)。

  • CharacterEscapeSequenceのCV ::NonEscapeCharacterは、NonEscapeCharacterのCVです
  • NonEscapeCharacter :: SourceCharacterのCVですが、 EscapeCharacterまたはLineTerminatorSourceCharacter文字自体ではありません。

引用自体は役に立たないかもしれませんが、リンクをたどって文法を見ると、それが明らかになるはずです。


したがって、PHPでは文字列に文字通り含まれます\"が、JSでは文字列に含まれるのは。だけ"であるため、JSONは無効になります。

{"data":"{"json":"rocks"}"}

JSで文字通りの円記号を作成する場合は、それをエスケープする必要があります。

'{"data":"{\\"json\\":\\"rocks\\"}"}'
于 2012-09-29T19:08:10.540 に答える
4

文字列リテラルにリテラル バックスラッシュを含めるには、 が必要\\です。

console.log(JSON.parse('{"data":"{\\"json\\":\\"rocks\\"}"}'));

これにより、JSON 処理の内部引用符が正常にエスケープされます。

于 2012-09-29T18:56:04.183 に答える
3

バックスラッシュをエスケープする必要があります。

console.log(JSON.parse('{"data":"{\\"json\\":\\"rocks\\"}"}'));​
于 2012-09-29T18:56:13.253 に答える
1

一重引用符内で二重引用符をエスケープする必要は実際にはなく、内部オブジェクトを囲む入力に2つの余分な引用符があります.

console.log(JSON.parse('{"data":{"json":"rocks"}}'));

で十分です。

于 2012-09-29T19:33:20.993 に答える