web-dev-qa-db-ja.com

最小の有効なJSONとは何ですか?

JSONの説明を注意深く読みました http://json.org/ ですが、簡単な質問に対する答えがわからない有効な最小のJSONはどの文字列ですか?

  • "string"は有効なJSON文字列ですか?
  • 42は有効な単純なJSONですか?
  • trueはブール値が有効なJSONですか?
  • {}は空のオブジェクトが有効なJSONですか?
  • []は空の配列が有効なJSONですか?
150
bessarabov

執筆時点では、JSONは RFC4627 でのみ記述されていました。 JSONテキストを(「2」の先頭で)シリアル化されたオブジェクトまたは配列として記述します。

つまり、only{}および[]は、その標準に準拠するパーサーおよび文字列化器の有効な完全なJSON文字列です。

ただし、、ECMA-404の導入により変更され、更新されたアドバイス ここで読むことができます 。私も ブログの投稿を書いた の問題について。


さらに問題を混乱させるために、Webブラウザーで利用可能なJSONオブジェクト(たとえばJSON.parse()およびJSON.stringify())は ES5で標準化 であり、これは許容可能なことを明確に定義しています次のようなJSONテキスト:

この仕様で使用されるJSON交換形式は、RFC 4627で説明されているものとまったく同じですが、2つの例外があります。

  • ECMAScript JSON文法の最上位レベルのJSONText生成は、RFC 4627で指定されているJSONObjectまたはJSONArrayに制限されるのではなく、JSONValueで構成されます。

  • snipped

これは、JSONオブジェクトが技術的にRFC 4627に準拠している場合でも、allJSONオブジェクト(文字列、ヌル、数字を含む)がJSONオブジェクトによって受け入れられることを意味します。 。

したがって、適合ブラウザでJSON.stringify(5)を介して数値を文字列化できます。この数値は、RFC4627に準拠する別のパーサーによって拒否されますが、上記の特定の例外はありません。例えば、Rubyは onlyがルートとしてオブジェクトと配列を受け入れるような例のように思えます 。一方、PHPは、 具体的には例外を追加します 「スカラー型とNULLもエンコードおよびデコードします」。

132
Matt

インターネットにはJSON標準と見なすことができるドキュメントが少なくとも4つあります。参照されるすべてのRFCは、MIMEタイプapplication/jsonについて説明しています。最上位レベルの値についてそれぞれが言わなければならないこと、およびオブジェクトまたは配列以外のものが最上位で許可されるかどうかは次のとおりです。

RFC-4627No。

JSONテキストはトークンのシーケンスです。トークンのセットには、6つの構造文字、文字列、数字、および3つのリテラル名が含まれます。

JSONテキストは、シリアル化されたオブジェクトまたは配列です。

JSONテキスト=オブジェクト/配列

RFC-4627は「提案された標準」ではなく「情報」とマークされ、 RFC-7159 によって廃止され、RFC-8259によって廃止されることに注意してください。

RFC-8259はい

JSONテキストはトークンのシーケンスです。トークンのセットには、6つの構造文字、文字列、数字、および3つのリテラル名が含まれます。

JSONテキストはシリアル化された値です。 JSONの特定の以前の仕様では、JSONテキストがオブジェクトまたは配列に制限されていました。 JSONテキストが要求されるオブジェクトまたは配列のみを生成する実装は、すべての実装がこれらを適合JSONテキストとして受け入れるという意味で相互運用可能です。

JSONテキスト= ws値ws

RFC-8259の日付は2017年12月で、「インターネット標準」とマークされています。

ECMA-262はい

JSON構文文法は、JSON字句文法で定義されたトークンの観点から有効なJSONテキストを定義します。文法のゴールシンボルはJSONTextです。

構文JSONText:

JSONValue

JSONValue:

JSONNullLiteral

JSONBooleanLiteral

JSONObject

JSONArray

JSONString

JSONNumber

ECMA-404はい

JSONテキストは、JSON値の文法に準拠するUnicodeコードポイントから形成されたトークンのシーケンスです。トークンのセットには、6つの構造トークン、文字列、数字、および3つのリテラル名トークンが含まれます。

39
Johann

RFC 4627 (RFC 7159により2014年3月に廃止された)の古い定義によれば、これらはすべて有効な「JSON値」でしたが、最後の2つだけが完全な「JSONテキスト」を構成します。

JSONテキストは、シリアル化されたオブジェクトまたは配列です。

使用するパーサーによっては、とにかく「JSON値」のみが受け入れられる場合があります。例(「JSON値」と「JSONテキスト」の用語に固執する):

  • JSON.parse() 現在のブラウザで標準化された関数は、すべての「JSON値」を受け入れます
  • PHP関数 json_decode は、「JSONテキスト」全体を受け入れるバージョン5.2.0で導入されましたが、バージョン5.2.1では「JSON値」を受け入れるように修正されました
  • Pythonのjson.loadsは、例に従って任意の「JSON値」を受け入れます このマニュアルページ上
  • http://jsonlint.com のバリデーターは、完全な「JSONテキスト」を期待します
  • Ruby JSONモジュールは、完全な「JSONテキスト」のみを受け入れます(少なくともコメント このマニュアルページ上

区別は、「XMLドキュメント」と「XMLフラグメント」の区別に少し似ていますが、技術的には<foo />は整形式のXMLドキュメントです(<?xml version="1.0" ?><foo />として記述した方が良いですが、コメントで指摘されているように、<?xml宣言技術的にオプションです)。

9
IMSoP

JSONはJavaScript Object Notationの略です。 {}[]のみがJavascriptオブジェクトを定義します。他の例は値リテラルです。 Javascriptにはこれらの値を操作するためのオブジェクトタイプがありますが、式"string"はリテラル値のソースコード表現であり、オブジェクトではありません。

JSONはJavascriptではないことに注意してください。データを表す表記法です。非常にシンプルで制限された構造です。 JSONデータは、{},:[]文字を使用して構造化されます。その構造内でのみリテラル値を使用できます。

サーバーがオブジェクトの説明またはリテラル値で応答することは完全に有効です。すべてのJSONパーサーは、リテラル値のみを処理するように処理する必要がありますが、値は1つのみです。 JSONは一度に1つのオブジェクトのみを表すことができます。したがって、サーバーが複数の値を返すには、オブジェクトまたは配列として構造化する必要があります。

4
Reactgular

はい、はい、はい、はい、はい。それらはすべて有効なJSON値リテラルです。

ただし、公式の RFC 4627 の状態:

JSONテキストは、シリアル化されたオブジェクトまたは配列です。

したがって、「ファイル」全体は、最も外側の構造としてオブジェクトまたは配列で構成される必要があり、もちろん空にすることもできます。それでも、多くのJSONパーサーは入力としてプリミティブ値も受け入れます。

2
Bergi

Ecma仕様は参照に役立つ場合があります。

http://www.ecma-international.org/ecma-262/5.1/

解析関数は、JSONテキスト(JSON形式の文字列)を解析し、ECMAScript値を生成します。 JSON形式は、ECMAScriptリテラルの制限された形式です。 JSONオブジェクトはECMAScriptオブジェクトとして実現されます。 JSON配列はECMAScript配列として実現されます。 JSON文字列、数値、ブール値、およびnullは、ECMAScript文字列、数値、ブール値、およびnullとして実現されます。 JSONはWhiteSpaceよりも限られたスペース文字セットを使用し、UnicodeコードポイントU + 2028およびU + 2029をエスケープシーケンスを使用せずにJSONStringリテラルに直接表示できます。構文解析のプロセスは、JSON文法によって制約される11.1.4および11.1.5に似ています。

JSON.parse("string"); // SyntaxError: Unexpected token s
JSON.parse(43); // 43
JSON.parse("43"); // 43
JSON.parse(true); // true
JSON.parse("true"); // true
JSON.parse(false);
JSON.parse("false");
JSON.parse("trueee"); // SyntaxError: Unexpected token e
JSON.parse("{}"); // {}
JSON.parse("[]"); // []
2
Emil A.