JSONの説明http://json.org/を注意深く読みましたが、簡単な質問に対する答えがわかりません。最小限の有効なJSONとはどのような文字列ですか?
"string"
文字列は有効なJSONですか?42
単純な数字は有効なJSONですか?true
ブール値は有効なJSONですか?{}
空のオブジェクトは有効なJSONですか?[]
空の配列は有効なJSONですか?
JSONの説明http://json.org/を注意深く読みましたが、簡単な質問に対する答えがわかりません。最小限の有効なJSONとはどのような文字列ですか?
"string"
文字列は有効なJSONですか?42
単純な数字は有効なJSONですか?true
ブール値は有効なJSONですか?{}
空のオブジェクトは有効なJSONですか?[]
空の配列は有効なJSONですか?回答:
執筆時点では、JSONはRFC4627でのみ説明されていました。JSONテキストを( "2"の先頭で)シリアル化されたオブジェクトまたは配列として記述します。
この手段のみ {}
と[]
パーサとその標準に準拠stringifiersで有効な、完全なJSON文字列です。
ただし、ECMA-404の導入によりそれが変更され、更新されたアドバイスはここで読むことができます。この問題に関するブログ投稿も書いています。
ただし、問題をさらに混乱させるために、Webブラウザーで使用できるJSON
オブジェクト(例:JSON.parse()
およびJSON.stringify()
)はES5で標準化されており、次のように、受け入れ可能なJSONテキストを明確に定義しています。
この仕様で使用されるJSON交換形式は、RFC 4627で説明されている形式とまったく同じですが、次の2つの例外があります。
ECMAScript JSON文法の最上位のJSONText生成は、RFC 4627で指定されているJSONObjectまたはJSONArrayに制限されるのではなく、任意のJSONValueで構成できます。
切り落とした
つまり、JSONオブジェクトは技術的にRFC 4627に準拠していますが、JSONオブジェクトはすべての JSON値(文字列、null、数値を含む)を受け入れます。
したがってJSON.stringify(5)
、を介して適合ブラウザで数値を文字列化できます。これは、RFC4627に準拠している別のパーサーによって拒否されますが、上記の特定の例外はありません。たとえば、Rubyは、オブジェクトと配列のみをrootとして受け入れる1つの例です。一方、PHPは、「スカラー型とNULLもエンコードおよびデコードする」という例外を具体的に追加しています。
true
、false
またはnull
単独の有効なJSONテキストのですか?これは他のほとんどの回答/コメントと矛盾しているので、出典を引用してください。
インターネット上には、JSON標準と見なすことができるドキュメントが少なくとも4つあります。参照されているRFCはすべてMIMEタイプを記述していapplication/json
ます。トップレベルの値と、オブジェクトまたは配列以外のものをトップで許可するかどうかについて、それぞれが次のように言う必要があります。
RFC-4627:いいえ。
JSONテキストはトークンのシーケンスです。トークンのセットには、6つの構造文字、文字列、数字、および3つのリテラル名が含まれています。
JSONテキストは、シリアル化されたオブジェクトまたは配列です。
JSON-text =オブジェクト/配列
RFC-4627は「提案された標準」ではなく「情報提供」としてマークされ、RFC-7159によって廃止され、RFC-8259によって廃止されることに注意してください。
RFC-8259:はい。
JSONテキストはトークンのシーケンスです。トークンのセットには、6つの構造文字、文字列、数字、および3つのリテラル名が含まれています。
JSONテキストはシリアル化された値です。JSONの特定の以前の仕様では、JSONテキストがオブジェクトまたは配列になるように制約されていました。JSONテキストが要求されるオブジェクトまたは配列のみを生成する実装は、すべての実装がこれらを適合JSONテキストとして受け入れるという意味で相互運用可能です。
JSON-text = ws value 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つのリテラル名トークンが含まれます。
RFC 4627(2014年3月にRFC 7159によって廃止された)の古い定義によれば、これらはすべて有効な「JSON値」でしたが、最後の2つだけが完全な「JSONテキスト」を構成します。
JSONテキストは、シリアル化されたオブジェクトまたは配列です。
使用するパーサーによっては、「JSON値」だけが受け入れられる場合があります。例(「JSON値」と「JSONテキスト」の用語を区別しない):
JSON.parse()
最近のブラウザーで標準化された関数は、「JSON値」を受け入れますjson_decode
はバージョン5.2.0で導入され、「JSONテキスト」全体のみを受け入れましたが、バージョン5.2.1では「JSON値」を受け入れるように修正されましたjson.loads
例によると、Python は「JSON値」を受け入れますこの区別は、「XMLドキュメント」と「XMLフラグメント」の区別に少し似ていますが、技術的に<foo />
は整形式のXMLドキュメントです(として記述した方がよいですが<?xml version="1.0" ?><foo />
、コメントで指摘されているように、<?xml
宣言は技術的にオプションです) )。
<foo />
は整形式の XMLドキュメントですが、有効なドキュメントではありません。(ただし、同じことが<?xml version="1.0" ?><foo />
。)
<foo />
場合とそうでない場合があるので、私はチェックしていましたが、それはその標準で述べられていることではありません。
ecma仕様は参照に役立つ場合があります。
http://www.ecma-international.org/ecma-262/5.1/
parse関数は、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("[]"); // []
JSON.parse
関数は、クロックフォードの文法とRFCに基づいてのECMAScript標準のそれ以降のバージョンに追加されました。
JSON.parse("\"string\"");
JSONはJavaScript Object Notationの略です。JavaScriptオブジェクトのみ{}
を[]
定義します。他の例は値リテラルです。JavaScriptには、これらの値を操作するためのオブジェクトタイプがありますが、式"string"
はリテラル値のソースコード表現であり、オブジェクトではありません。
JSONはJavaScriptではないことに注意してください。データを表す表記です。非常にシンプルで限定的な構造です。JSONデータは{},:[]
文字を使用して構造化されます。その構造内ではリテラル値のみを使用できます。
サーバーがオブジェクトの説明またはリテラル値のいずれかで応答することは完全に有効です。すべてのJSONパーサーは、リテラル値だけを処理するために処理する必要がありますが、値は1つだけです。JSONは一度に1つのオブジェクトしか表現できません。したがって、サーバーが複数の値を返すには、オブジェクトまたは配列として構造化する必要があります。
var x;
JSON.stringify(x); // will output "{}"
だからあなたの答えは"{}"
、空のオブジェクトを表すものです。
undefined
「{}」ではなくを与えます`
json.orgページにある鉄道図に従ってください。[]および{}は、可能な最小の有効なJSONオブジェクトです。したがって、答えは[]と{}です。
array
とobject
、あなたは右のだろうが、それは予想するのが妥当だvalue
開始します。
values
代わりに(またはそれに加えて)ルールを見る場合、スタンドアロンの数値と文字列は有効なJSONドキュメントです。array
object
[]
、これまで問題について意見があったすべての仕様での有効なJSONテキストは、JSONオブジェクトではないため、「有効なJSONオブジェクト」ではありません。JSONの「オブジェクト」は特に{}
表記法を指します。JSON配列はJSONオブジェクトではありません。