JSONキーは引用符で囲む必要がありますか?


235

例:次のコードはJSON仕様に対して有効ですか?

{
    precision: "zip"
}

または、常に次の構文を使用する必要がありますか?(もしそうなら、なぜですか?)

{
    "precision": "zip"
}

JSONの仕様では、これについて実際には何も見つかりませんでした。例では、キーを引用符で囲んでいますが。

回答:


147

はい、引用符が必要です。これはそれをより簡単にし、javascriptの予約済みキーワード用の別のエスケープメソッドを必要としないようにするため{for:"foo"}です。


12
手作業で編集された構成ファイルなど、多くの状況で引用符は単純ではありません。JSONがほとんど普遍的な交換フォーマットとして使用されている(および誤用されている)の残念な点は、JavaScriptに固有の機能があることです。
ミゲル2015年

12
本当の理由-あまりにもこの答えをチェック- stackoverflow.com/questions/4201441/...
TechMaze

3
Tl; dr:(引用符で囲まれていない)予約済みキーワードのキーとしてのECMAScriptの制限に対処したくなかったため、すべてのキーを引用符で囲む必要がありました。
BallpointBen 2018

136

キーとして文字列を使用するのは正しいことです。RFC 4627からの抜粋-JavaScript Object Notation(JSON)のapplication / json Media Type

2.2。オブジェクト

オブジェクト構造は、0個以上の名前/値ペア(またはメンバー)を囲む中括弧のペアとして表されます。 名前は文字列です。各名前の後にコロンを1つ付けて、名前と値を区切ります。1つのカンマで値と後続の名前を区切ります。オブジェクト内の名前は一意である必要があります。

object = begin-object [ member *( value-separator member ) ] end-object

member = string name-separator value

[...]

2.5。文字列

文字列の表現は、プログラミング言語のCファミリで使用される規則に似ています。文字列は引用符で始まり、引用符で終わります。[...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

RFC全体をここで読んでください


11
そして、思想を完了するために、セクション2.5は言います:A string begins and ends with quotation marks.
rakslice 2013

13

2.2から。オブジェクト

オブジェクト構造は、0個以上の名前と値のペア(またはメンバー)を囲む中括弧のペアとして表されます。名前は文字列です。

そして2.5から。文字列

文字列は引用符で始まり、引用符で終わります。

だから私は標準に従ってそう言います:はい、あなたは常にキーを引用するべきです(いくつかのパーサーはより寛容かもしれませんが)



0

はい、彼らはやる。ただし、それ以外の場合はJSON5をチェックアウトしてください

JSON5は、ES5構文を許可するJSONのスーパーセットです。

  • 引用符で囲まれていないプロパティキー
  • 一重引用符でエスケープされた複数行の文字列
  • 代替数値形式
  • コメント
  • 余分な空白

JSON5リファレンス実装(json5npmパッケージ)は、組み込みオブジェクトと同じ引数とセマンティクスJSON5を持つメソッドparsestringifyメソッドを持つオブジェクトを提供しJSONます。


-2

「parent.child」のドット表記を使用でき、これも有効で便利なparent ["child"]を使用する必要がないため、技術的にはどちらの方法でも許容できると思います。パーサーはすべて、両方の方法をうまく実行する必要があります。パーサーがキーの引用符を必要としない場合、それらを配置しない方がよいでしょう(スペースを節約します)。それが文字列であるという理由でそれらを文字列と呼ぶのは理にかなっており、角括弧はキーに値を使用する機能を提供するので、基本的にそうすることは完全に理にかなっています。Jsonではあなたが置くことができます...

>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};

>obj
Object {someKey: "someValue"}

問題なく問題なく、キーの値が必要で、引用符で囲まれたものはどれも機能しないため、機能しない場合は機能しないので、「キーに引用符は必要ありません」とは言えません。たとえそれが技術的に文字列であると言うのは正しいとしてもです。論理と使用法はそれ以外の場合に主張します。また、任意のブラウザーのコンソールから実行したこの例では、objのObject {"someKey": "someValue"}を正式に出力しません。


2
受け入れられた回答とJSONを定義するRFCの両方で、引用符が必要であると述べています。
キーストンプソン

それは事実ですが、論理的には必要がないことに注意する価値があります。私は、すべてのブラウザコンソールのJavaScript Object Notation出力が間違っていると思います。誰かに修正するように指示する必要があります。たぶん、ブラウザコンソールがオブジェクトに対して出力するものはJSONではないので、仕様で定義されているJSONは、ほとんどの場所で必要ではなく、そのように実装されていません。とにかく私は主張をしたかっただけで、事実を別の見方で見ています。おそらく、仕様を変更する必要があるかもしれません。「Quoted Keys」は、私にとって重要な場所には必要ありません。(実際にはそのように使用されていません。)
マスタージェームズ

2
JSON、JavaScriptオブジェクトリテラル、ブラウザ開発者ツールのコンソール出力の3つの異なるものを混同しています。objコンソールにを入力すると、人間が読める形式のオブジェクトがブラウザに表示されます。オブジェクトのリテラルとして表示することも(例のように)、インタラクティブなものを含め、他の表現を使用することもあります。JavaScriptオブジェクトリテラルでは、キーが有効な識別子であり、予約語ではない場合、キー名を引用符で囲む必要はありません。ただし、JSONでは常にキー名を囲む引用符必要です。
Michael Geary

3
さらなる例としてobj、コンソールに入力する代わりに、を試してくださいJSON.stringify(obj)。これで、オブジェクトの有効なJSON表現が表示され、引用符で囲まれたキー名が完成します。逆に、文字列が有効なJSONかどうかを確認するには、を試してくださいJSON.parse(string)。キーが引用符で囲まれていない場合、これは例外をスローします。たとえば、JSON.parse('{"a":"b"}')成功JSON.parse('{a:"b"}')しますが失敗します。
Michael Geary

1
OTOHさんの使い方var obj = {[keyName]:"someValue"};はとても面白いです!JavaScriptオブジェクトリテラルでそれができるとは知りませんでした。少し確認すると、これはES6の新機能であることを示しています-ES5ではできませんでした。
Michael Geary
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.