console.log(JSON.parse('{"data":"{\"json\":\"rocks\"}"}'));
エラーが発生します (Firefox および Chrome のコンソールでテスト済み)。これは JSON.parse のバグですか? PHPでテストすると、同じデコードがうまくいきます。
print_r(json_decode('{"data":"{\"json\":\"rocks\"}"}', true));
console.log(JSON.parse('{"data":"{\"json\":\"rocks\"}"}'));
エラーが発生します (Firefox および Chrome のコンソールでテスト済み)。これは JSON.parse のバグですか? PHPでテストすると、同じデコードがうまくいきます。
print_r(json_decode('{"data":"{\"json\":\"rocks\"}"}', true));
この文字列は、PHPとJSで異なる方法で処理されます。つまり、異なる結果が得られます。
PHPで一重引用符で囲まれた文字列のエスケープシーケンスは、\\
とだけ\'
です。ドキュメントによると、他のすべては文字通り出力されます:
リテラルの一重引用符を指定するには、円記号()でエスケープします
\
。リテラルの円記号を指定するには、それを2倍にします(\\
)。バックスラッシュの他のすべてのインスタンスは、文字通りのバックスラッシュとして扱われます。これは、\r
またはなど、慣れている他のエスケープシーケンスが\n
、特別な意味を持つのではなく、指定されたとおりに文字通り出力されることを意味します。
一方、JSでは、文字列に無効なエスケープシーケンスが含まれている場合、バックスラッシュは破棄されます(CV
文字値を意味します)。
- CharacterEscapeSequenceのCV ::NonEscapeCharacterは、NonEscapeCharacterのCVです。
- NonEscapeCharacter :: SourceCharacterのCVですが、 EscapeCharacterまたはLineTerminatorはSourceCharacter文字自体ではありません。
引用自体は役に立たないかもしれませんが、リンクをたどって文法を見ると、それが明らかになるはずです。
したがって、PHPでは文字列に文字通り含まれます\"
が、JSでは文字列に含まれるのは。だけ"
であるため、JSONは無効になります。
{"data":"{"json":"rocks"}"}
JSで文字通りの円記号を作成する場合は、それをエスケープする必要があります。
'{"data":"{\\"json\\":\\"rocks\\"}"}'
文字列リテラルにリテラル バックスラッシュを含めるには、 が必要\\
です。
console.log(JSON.parse('{"data":"{\\"json\\":\\"rocks\\"}"}'));
これにより、JSON 処理の内部引用符が正常にエスケープされます。
バックスラッシュをエスケープする必要があります。
console.log(JSON.parse('{"data":"{\\"json\\":\\"rocks\\"}"}'));
一重引用符内で二重引用符をエスケープする必要は実際にはなく、内部オブジェクトを囲む入力に2つの余分な引用符があります.
console.log(JSON.parse('{"data":{"json":"rocks"}}'));
で十分です。