配列を最上位のJSONテキストにすることはできますか?


回答:


126

はい、配列はトップレベルのJSONテキストとして正当です。

JSONを定義する3つの標準ドキュメントがあります。RFC4627RFC 7159(RFC 4627に代わるもの)、およびECMA-404です。それらは許可する最上位要素が異なりますが、すべてが最上位要素としてオブジェクトまたは配列を許可します。

  • RFC 4627:オブジェクトまたは配列。
    「JSONテキストはシリアル化されたオブジェクトまたは配列です。」
  • RFC 7159:JSON値。
    「JSONテキストはシリアル化された値です。」
  • ECMA-404:任意のJSON値。
    「JSONテキストは、JSON値の文法に準拠するUnicodeコードポイントから形成される一連のトークンです。」

2
この新しいRFCの時点で、「JSONテキストは一連のトークンです。トークンのセットには、6つの構造文字、文字列、数字、および3つのリテラル名が含まれています。」
antak 2016年

63

はい。ただし、JSONハイジャックのため、一部のシナリオではルートをオブジェクトにすることを検討する必要があります。これは、JavaScriptの配列コンストラクターのオーバーライドに基づく情報漏えいの脆弱性です。


11
はい、それは素晴らしい答えの特徴です-彼らが知りたいことをOPに伝えるだけでなく、彼らが知っておくべきこと(しかし、気づかなかった)もOPに伝えます。実際、JavaScriptとして解析されるJSONに関連する脆弱性がたくさんあります。JSONハイジャックはほんの一例です。
sleske


4

これはECMAScript仕様によるものです。

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber

1
ただし、ECMAScriptではトップレベルのテキストではないJSON文字列を解析できるため、これは少し誤解を招きます。RFCによると、「JSONテキストはシリアル化されたオブジェクトまたは配列です。」
Matthew Flaschen

@マシュー-奇妙なことに、クロックフォードはそれについてどう感じているのだろう。彼らはどのようにしてRFCとECMAの違いを調整しますか?
ChaosPandion

3
私は見たところ、違いを認識していることがわかりました。ECMAScript 5§15.12から、「ECMAScript JSON文法の最上位のJSONText生成は、RFC 4627で指定されたJSONObjectまたはJSONArrayに限定されるのではなく、任意のJSONValueで構成されている可能性があります。」IETFがRFCを変更するかどうかはわかりません。
Matthew Flaschen、

@マシュー-そのおかげで、私はひどく混乱していました。json.orgの記述は、より制限「JSONテキスト」の概念に言及していないすべてであり、その意義について漠然としたのRFCのようなものを。
mrec 2013

この答えはECMAScriptについてですが、問題はJSONについてです。それらは(意図的に)似ていますが、仕様異なります。
sleske

2

はい、こちらでお試しください。

http://www.jsonlint.com/

[{}]に入れます


3
それよりもさらに簡単です。入れれ[]ば検証されます。
sorpigal

リンクが機能していません。更新(またはほとんどリンクのみ)してください。
Anthon

1

他のコメントで見られるように、いくつかの混乱があります。「application / json」メディアタイプでは、JSON RFCに従って、JSON-textのトップレベルのオブジェクトまたは配列のみを許可します。ただし、ECMAScript仕様に示されているように、パーサーには任意のJSON値を使用できます。


トップレベル要素としてのJSON値はECMAScriptパーサーでは受け入れられますが、(準拠)JSONパーサーでは受け入れられません-重要な違いです。
sleske

それは興味深い違いですが、あなたの言っていることがわかりません。「(準拠)JSONパーサー」の定義は何ですか?
cdunn2001

1
まあ、JSONパーサーはJSON文法のパーサーです。JSONはJavascriptに似ていますが、異なる(はるかに単純な)文法です。JSON文法について説明しているtools.ietf.org/html/rfc7159を参照してください。「準拠」とは、パーサーが実際に文法に従うことを意味します(適切なパーサーはこれを行う必要があります)。
sleske

3
RFC 4627は古くなっています。もう従わないでください。新しいRFCでは、トップレベルでの単純な値も許可されています。
Matthias DieterWallnöfer2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.