ECMA262 の第 5 版の説明によると、JSON は stringify メソッドと parse メソッドを提供する組み込みオブジェクトで、前者は js オブジェクトを json 標準に準拠した文字列に変換するために使用され、後者は json に準拠した文字列を変換します。標準を js オブジェクトに変換します。 json 標準リファレンス json.org 。 (実際には、eval を使用して json 標準に準拠した文字列を js オブジェクトに変換できますが、eval はパフォーマンスが比較的低く、セキュリティ上のリスクがあります (json 文字列内のコードが実行されます)。この記事では JSON のみを記述します。 )
この記事では、JSON.parse メソッドに対する変換の意味文字の影響について書きます。
一般に、JSON.parse のパラメーターに転送文字が含まれている場合、2 つのエスケープの問題が発生します。実際、1 回目は文字列自体のエスケープであり、2 回目は実際の文字列への変換です。 jsオブジェクトのエスケープ。
例は次のとおりです。
例 1: 文字列 '{"a":"b","b":"\\"}' を JSON.parse に渡し、最初にパーサーが抽出します一重引用符 文字列を囲む場合、最初の文字列がエスケープされ、2 番目の文字列がエスケープされ、3 番目の文字列が 4 番目の文字列でエスケープされると見なされます。つまり、実際の出力文字列は {"a":" になります。 b","b":"\"} (console.log('{"a":"b","b":"\\"}') で確認できます)、さらに別のエスケープがありますこれが正式に js オブジェクトに変換されると、これが実際の出力文字になります。最初の文字は 2 番目の文字をエスケープします (この時点では 2 つだけです)。したがって、 console.log(JSON.parse('{"a":"b","b":"\\"}') ); 出力結果は Object {a: "b", b: ""},つまり、実際に表示されるデータは 1 つです (実際には 1 つのデータを出力でき、この前に別のデータがあることを示します)。
例 2:
var obj = {
a : "b",
b : "\",
c : {
b : "\",
a : {
b : "\"
}
}
};
var json_str = JSON.stringify(obj);
console.log( JSON.stringify(obj) ); ;
console.dir(JSON.parse(json_str));
console.dir(JSON.parse('{"a":"b","b":"\\","c": {"b":"\\","a":{"b":"\\"}}}'));出力結果は以下の通りです
pic
エスケープ規則によれば、実際の出力は、この出力の前に 1 つある必要があります。したがって、上記の最初の行の出力は '{"a":"b","b":"\\","c":{"b":"\\","a":{" b" となります。 :"\\"}}}'。これは 3 番目の出力で確認できます。
要約すると、js オブジェクトに 1 つ表示したい場合は、json 文字列に 4 つ表示する必要があります。
その他の特殊文字の場合
1. 二重引用符 (")、二重引用符が正しく表示される場合は、\"
2.n になります。考えてみてください。JSON 文字列に必要な正しい改行は次のとおりです。
実際、最初に n 内の文字をエスケープすると、n は通常の文字になり、js オブジェクトに解析されると、n と前の文字 (残り 1 つだけ) は改行として解釈されます。以下の2つも同様です。
3.r、
4.t、