日本語

開発者ツール · JSON フォーマッタおよびバリデータ

JSON 文法全体を 1 ページに: 6 つの値の型、2 つのコンテナー

· 背景

json 規格 検証

JSON 文法全体を 1 ページに: 6 つの値タイプ、JSON トークンで示された 2 つのコンテナー、および正確な検証境界
オリジナル ToolAcre ベクトル イラスト

JSON の文法全体が 1 ページに収まっており、それを暗記すれば、バリデーターのエラーがすべて明らかになります。この投稿では、6 つの値のタイプ、2 つのコンテナ、および人々をつまずかせるいくつかのルールについて説明します。

これまでに見たすべてのエラーは 1 つのページから発生しています

すべての構文エラーは、コンパクトな文法における期待を裏切るものです。オブジェクトを開いた後、パーサーは引用符で囲まれたメンバー名または右中括弧を期待します。名前の後にはコロンが必要です。値の後には、コンマまたはコンテナの終わりが必要です。エラーを遷移の失敗として読み取ることは、報告された文字を謎として扱うよりも便利です。

ToolAcre は、標準の JSON 値と空白を受け入れ、2 つの実用的な入力制限を適用します。 8,000,000 文字より長いテキストは解析前に拒否され、512 コンテナーを超えてネストされているスキャナーは無制限に走査されるのではなく拒否されます。これらは製品の境界であり、新しい JSON タイプではありません。その中で、診断は、トークン ストリームが文法を満たせなくなった最初のポイントを特定します。

6 つの値 — オブジェクト、配列、文字列、数値、true/false、null、および他に何もないという事実

JSON 値は、オブジェクト、配列、文字列、数値、ブール値、または null です。オブジェクトと配列には、さらに多くのコンテナを含め、6 つのいずれかを含めることができます。リテラルのスペルは正確に `true`、`false`、`null` です。大文字の使用は柔軟ではありません。 `True`、`None`、`undefined`、`NaN`、`Infinity` などのトークンは、別の言語で一部が認識される場合でも、厳密な JSON の範囲外になります。

この短いリストにより、分類が有用なデバッグ手法になります。 `{"reading": NaN}` では、コロンによって値が正しく導入されますが、`N` では、許可された値を開始することはできません。データが何を意味するのか (`null` や引用ステータスなど) を決定した後でのみ置き換えてください。構文ツールはトークンを拒否することができます。アプリケーションの代替を選択したり、フィールドがそこに属するかどうかを決定したりすることはできません。

オブジェクトと配列 - カンマ区切りのメンバー、コロン、および RFC 8259 が順序付けと名前の重複を実装に任せている理由

オブジェクトには、カンマ区切りの name/value メンバーが含まれます。すべての名前は二重引用符で囲まれた文字列の後にコロンと値が続きます。配列には、名前やコロンのないカンマ区切りの値が含まれます。空の `{}` および `[]` コンテナーは有効ですが、コンマを前後に付けたり、2 回使用したりすることはできません。各区切り文字をそのコンテナに一致させると、多くの明らかな「予期しないトークン」エラーがすぐに明らかになります。

オブジェクト名は一意であることが期待されますが、重複したスペルはこのバリデーターによって拒否されません。 `{"port": 80, "port": 443}` は解析し、`JSON.parse` は後の値を保持します。書式設定では、その生き残ったメンバーのみが出力されるため、以前のテキストを結果から復元することはできません。配列の位置の動作は異なります。すべての要素は存在し続け、その順序は値の一部です。

文字列と数値を正確に

文字列には二重引用符が使用されます。バックスラッシュには、引用符、バックスラッシュ、スラッシュ、`b`、`f`、`n`、`r`、`t`、または 4 桁の Unicode エスケープが導入される場合があります。生の制御文字は禁止されています。一重引用符は、文字列の外側にある通常の無効なトークンです。これらのルールは、コピーされた JavaScript リテラルと貼り付けられた複数行のテキストが、厳密な JSON 検証に失敗しても読みやすいように見える理由を説明しています。

数値には、マイナス記号、整数部分、オプションの小数部、およびオプションの指数を含めることができます。 `+` で始めること、16 進数表記の使用、別の数字の前に先頭のゼロを付けること、または非有限値を指定することはできません。 `-0.25e+2` は有効です。 `01`、`.5`、`2.`、および `Infinity` はそうではありません。解析では、JavaScript がすべての数字を正確に保持できるかどうかではなく、文法をチェックします。

空白とトップレベル

文字列の外側では、JSON 空白はスペース、水平タブ、改行、および復帰に限定されます。 Web ページからコピーされた非改行スペースは、通常のスペースと置き換えることはできません。書式設定では、トークンの周囲に許可されている空白を自由に選択できますが、引用符で囲まれた文字列内にある空白はデータであるため、保持する必要があります。

完全なドキュメントは、オブジェクトや配列だけでなく、任意の単一の JSON 値にすることができます。 `42`、`false`、および `"ready"` は有効なトップレベル テキストです。禁止されているのは、最初の値の後の 2 番目の値です。`42 43` は 1 つではなく 2 つのドキュメントです。この違いは、改行区切りの JSON がファイル全体の通常の 1 回の解析ではなく、レコードごとの処理を必要とする理由を説明しています。

実用的な例: 小さなドキュメントを手動で解析する

`{"order": [17, null, {"paid": true}], "note": "ship soon"}` を選択してください。ルート オブジェクトは `order` という名前のメンバーで始まります。その値は、数値、null、および別のオブジェクトを含む配列です。次に、コンマによって `note` が導入され、その値はエスケープされた改行を含む文字列になります。すべてのコロン、カンマ、および終了区切り文字には、1 つの文法上の役割があります。

`paid` の前の引用符を削除します。ネストされた中括弧の後に、パーサーは右中括弧または引用符で囲まれた名前を期待するため、`p` で失敗します。あるいは、`true` の後にカンマを追加します。パーサーはコンマを受け入れますが、別のメンバーが後に続く必要があるため、`}` で失敗します。これらの位置を手動で予測すると、検証が確認に変わり、ランダムな句読点編集が防止されます。

これでカバーされない内容

文法には、日付、10 進数、2 進数、UUID、または期間タイプがありません。アプリケーションは通常、これらの概念を文字列または数値で表し、別途規則を課します。タイムスタンプは、完全に有効な JSON 文字列である場合もありますが、不可能な日付が含まれる場合もあります。同様に、構文的に有効なオブジェクトは、単一の解析ルールに違反することなく、必要なプロパティを省略したり、間違った単位を使用したりすることができます。

ToolAcre は、スキーマ チェック、ドメイン検証、または正規化を実行しません。また、コメントや末尾のカンマなどの JSON5 または JSONC の機能も再解釈しません。その仕事はより狭く、製品の制限内で 1 つの厳密な JSON テキストを受け入れ、解析された値をフォーマットし、構文エラーを識別します。使用側アプリケーションの検証層の形状と意味に関する質問は後回しにしておきます。

教訓: 文法を覚え、立場を信頼する

耐久性のあるチェックリストは短く、6 つの値カテゴリ、引用符で囲まれたオブジェクト名、項目間のカンマのみ、名前と値の間のコロンのみ、厳密な文字列エスケープ、厳密な数値のスペル、4 つの空白文字、および 1 つのトップレベル値です。文書が失敗した場合は、報告された位置の直前で文法が許可している内容を特定し、その期待値と実際に存在する文字を比較します。

必ずしも削除が必要な文字ではなく、最初の不可能な点として位置を信頼してください。前のコンマが別のメンバーを約束しているため、右中括弧が強調表示される場合があります。罪のない手紙は、冒頭の引用符が欠落しているために強調表示される場合があります。原因を修復し、検証を再実行し、繰り返します。サイズが大きすぎる入力または非常に深い入力の場合は、構文診断が役立つ前に、8 百万文字または 512 深さの積境界に対処してください。