/ JSONではエスケープシーケンスは順番にエスケープされますか?それとも同時にエスケープされますか? - json

エスケープシーケンスはJSONで順番に、または同時にエスケープされていますか? - json

文字列 "u"をJSON文字列に格納したいとします。

この回答はJSONのエスケープシーケンスの見栄えの良い概要を提供しますしかし、それが同時に見えているのか、順番になっているのかは、その絵からは明らかではありません。

次のJSONを考えてください。

{
"foo": "a\u"
}

これは - 少なくとも私には - 有効なJSONであるはずです。 foo 文字列を含む au.

しかしながら u Unicode文字のエスケープシーケンスで、通常は4つの16進文字を続ける必要があります。

私が同じJSONに入ったとき Json Parser Online私が使うと信じて JSON.stringify "uの後には4つの16進文字が続く必要があります"というエラーが発生します。

また、FirefoxとChromeの両方のコンソールに次のように入力してみた。

var json = JSON.stringify(eval("(" + "{"foo": "a\u"}" + ")"));

そして両方ともUnicodeエスケープシーケンスエラーを引き起こします。図書館でも Delphiのスーパーオブジェクト 同じエラーが発生します(または実際には、単にJSON解析エラーが発生します)。

を見て RFC 7159 文字列では、これらのエスケープシーケンスについて言及していますが、順序については言及していません。

私にはJSON規格は次の順序を考慮していないようです \uまたは、少なくとも、パーサーはそれをうまく処理できません。 \ 最初にエスケープされます、 \u 〜になる u そして u 間違っているでしょう。もし u 最初にエスケープされ、それがに到達する前にエラーが発生します。 \.

これは特に問題です。 JSONのリッチテキスト、なぜなら、 uc1 そして uc2 RTFの一般的な制御シーケンスです。問題となっている答えは、実際にはその主題に触れているわけではありませんが、その質問もまた放棄されているようです。

理論的な質問は、エスケープシーケンスはどのように(そしてどのように)すべきかということです。

そしてもっと実用的な質問は、文字列リテラルをどうやって取得するかです。 u 単純にどちらかのUnicodeシーケンスを提供する以外にJSON文字列に または u (例えば。 au005Cu)?

回答:

回答№1は1

JSONのエスケープシーケンスの順序は何ですか?

左から右へ。 \u 文字列を含む あなた.

文字列リテラルuをJSON文字列に変換する方法

"\u"

Json Parser Onlineで同じJSONを入力すると、JSON.stringifyを使用すると、「uの後に4つの16進文字が続く必要があります」というエラーが発生すると考えられます。

これはそのツールのバグのようです。

ブラウザのJSON.parseを使った単純な構文解析でもうまくいきます。

// Note: The slashes have to be escaped to be put in the JS string literal.

var json = `{
"foo": "a\\u"
}`;

console.log("JSON is: " + json);
var object = JSON.parse(json);
console.log("String in parsed object is: " + object.foo);

var json = JSON.stringify(eval("(" + "{"foo": "a\u"}" + ")"));

JSONのエスケープ文字です。 また、 JavaScriptの文字列リテラルのエスケープ文字。

JavaScriptパーサーが変換します "a\u"au に渡す eval() これはJavaScriptの文字列リテラル(しかし無効なもの)として解析しようとします。 でJSONに変換しようとしています JSON.stringify)。