JSONキー名で有効/無効な文字はどれですか?


151

JavaScriptオブジェクトまたはJSON文字列のキー名に禁止文字がありますか?またはエスケープする必要のある文字?

具体的には、キー名に「$」、「-」、スペースを使用します。


私は部分的にこの答えはあなたがエンコードしている方法と関係があると思います。たとえば、UTF8にはANSIとは異なる文字が許可されています。
11

4
obj['whatever']表記法を使用して、JSで必要な任意の「キー」を使用できます。ただし、obj.whateverバージョンに使用できるのは通常の英数字キーだけです。
マークB

4
@invalidsyntax:JSONは定義によりUnicodeです。また、ANSIはエンコーディングではなく、文字セットであるため、比較はUTF-8-vs-ANSIではなく、Unicode-vs-ANSIにする必要があります。
Marcelo Cantos、2011

1
古い議論ですが、ASCII(人々がANSIでよく参照するもの)はエンコーディングであり、それに加えて文字セットも定義します。
トリニダード

回答:


167

いいえ。有効な文字列はすべて有効なキーです。それは"あなたがそれをエスケープする限りさえ持つことができます:

{"The \"meaning\" of life":42}

キーをオブジェクトフィールド名に関連付けようとする一部の言語に、そのような値をロードするのが困難になる可能性があります。しかし、私はそのようなケースを知りません。


どうも!エスケープする必要がある他の文字はありますか?のように:または; ?
クリストフ

11
それらではありません。JavaScriptでエスケープする必要があるものは、通常JSONでそれを必要とします。ただし、json.orgでは馬の口から取得するのが最善です。仕様全体をエンドツーエンドで読み取るのに約1分かかります。
Marcelo Cantos、2011

3
これは私にとって良い答えではありません。エスケープする必要があるのはどの種類の文字ですか?エスケープできる文字はどれですか?エスケープする必要はありませんか?
ダニエルW.

Unicodeのnull文字(U + 0000、UTF-8のプレーンな「nullバイト」)などが含まれているかどうか誰でも明確にできますか?json.orgとリンクされた公式/正式なECMA仕様PDF の両方は、そうです、それらはJSONで有効です\u four-hex-digits
mtraceur 2016年

1
@OutofOrbit型なしオブジェクトにロードできますか?
Marcelo Cantos

54

問題を回避するには、JSONデータで次の文字をエスケープする必要があります

'単一引用符

" 見積もり

\バックスラッシュ

\ n \ tのようなすべての制御文字

JSONパーサーは、JSONの処理に役立ちます。

編集: OPのリンクが死んでいるので、ここに置換JSONパーサーがあります


5
こんにちはアルン、一重引用符をエスケープする必要はありません。それらを実際にエスケープすると、厳密なJSONパーサーが例外をスローします。json.orgの文字列セクションを参照してください。もちろん、JSON文字列(JSON自体ではない)の内部ではエスケープする必要があります。
Alex KeySmith、2014年

5
@AlexKeyあなたは完全に正しいです!Arunは、あなたが上でこれを確認することができますjsonlint.com JSONをテストすることによって、{ "singlequotetest": "something here isn\'t right"}{ "singlequotetest": "Fixing here what wasn't right"}
してエイドリアン

@Arun Rana-心配は無用です。
Alex KeySmith 2014

3
{"*〜@#$%^&*()_ + => <?/": "is a valid json"}
Abhi

45
{"🐶🔫": "not nice, but still valid json"}
Marcelo Cantos、2015

12

数字でキーを開始することは有効ですが、意図しない問題が発生する可能性があることに注意してください。

例:

var testObject = {
    "1tile": "test value"
};
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround

6
マイクロソフトのこの2017/18歳の時代に、彼らが苦しんできたすべての痛みを後悔していることを心から願っています。
monsto

1
それらのメトリックIDパラメーターを見てください:dev.applicationinsights.io/apiexplorer/… --- 15または20のフィールドのjsonフィールド名に複数のスラッシュがあります。Karnsソリューションは特定のフィールドで機能しますが、1tileのサブフィールドでは機能しないようです。たとえば、次のドットはundefinedを返します。
Jon Luzader 2017

そこでIEが言及されているのはなぜですか?すべてのECMAScript実装では、数値で始まる識別子は無効です。
m93a

@ m93a IEはInternet Explorerの頭字語ではありません...単語の選択が
間違ってい

これが最良の答えでなければなりません
ジョーEliaの

7

UnicodeコードポイントU + D800からU + DFFFは回避する必要があります。これらはUTF-16サロゲートペア用に予約されているため、Unicodeでは無効です。一部のJSONエンコーダー/デコーダーは、それらをU + FFFDに置き換えます。たとえば、Go言語とそのJSONライブラリがそれらをどのように処理するかをご覧ください。

したがって、「\ uD800」から「\ uDFFF」だけを(サロゲートペアではなく)使用しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.