用語辞典・データ・文字コード

JSON

JSONとは

JSON(JavaScript Object Notation/ジャバスクリプト・オブジェクト・ノーテーション/ジェイソン)は、オブジェクトと配列を、文字列・数値・真偽値などで表す軽量なテキストデータ形式です。

APIの要求・応答、設定、保存データなどで使われます。名前にJavaScriptを含みますが、多くのプログラミング言語にパーサーと生成ライブラリーがあります。

JSONはデータの構文を決めますが、その値が氏名か日時か金額か、必須かどうかまでは決めません。意味と制約はAPI仕様やJSON Schemaなどで別に定めます。

オブジェクトと配列が値を入れ子にする厳密な解析器、重複キー、数値精度、UTF-8を別に確認する
一つのJSON文書がキーと値の組を持つオブジェクトと順序付き配列へ分かれ、文字列・数値・真偽値・null・入れ子を表す図、コメントや末尾カンマなどの拒否、重複キー、巨大数値の精度差、UTF-8転送を示すピクトグラム図解
図1オブジェクトのメンバー順は意味を持たず、配列の要素順はデータの一部です。画面の並びが同じでも型が違えば別の値です。

JSONで使える値は六種類

オブジェクト名前と値の組

文字列の名前と値をメンバーとして波括弧内へ並べます。

配列順序付きの値

角括弧内へ値を順に並べ、同じ型に限定されません。

文字列Unicode文字列

二重引用符で囲み、制御文字などをエスケープします。

数値10進表記の数

整数と小数を表せますが、受け手が正確に扱える範囲は別です。

真偽値true / false

引用符で囲まない二つの真偽値です。

null値がないことを示す値

項目自体がない状態とは区別される場合があります。

構文は短いが厳密

{
  "name": "花子",
  "active": true,
  "scores": [82, 91],
  "note": null
}

オブジェクトの名前と文字列は二重引用符で囲みます。標準JSONにはコメント、単一引用符、末尾カンマ、JavaScript固有の未定義値、NaN、Infinityがありません。JavaScriptのオブジェクトリテラルやJSON5、設定ファイル独自の拡張と混同してはいけません。

JSON生成ライブラリーを使えば、引用符、改行、バックスラッシュ、制御文字を正しくエスケープできます。文字列連結でJSONを作ると、構文エラーや注入の原因になります。

オブジェクトは順序なし、配列は順序あり

オブジェクトは名前と値のメンバー集合であり、メンバーの並び順へ意味を持たせません。表示順や処理順が必要なら、配列や明示的な順序値を使います。

配列は並びが意味を持ち、先頭から位置で識別できます。ただし途中へ要素を挿入すると索引が変わるため、永続的な識別子として索引だけを使う設計には注意します。

オブジェクト内に重複する名前を作らない

同じオブジェクトに同じ名前が複数あるJSONを受けると、実装によって最後を採用、最初を採用、すべて保持、エラーという差が生じます。RFC 8259は相互運用のため名前を一意にするべきだとしています。

検査器と実行側が別の値を選ぶと、権限や設定の検査をすり抜けます。生成側は重複を出さず、受信側は重複を検出して拒否する方針を検討します。

番号の範囲と精度は実装で違う

JSONの文法は桁数上限を小さく固定しませんが、多くの実装はIEEE 754 binary64(バイナリー64/倍精度浮動小数点数)を使います。非常に大きな整数や細かな小数は、別の言語へ渡したとき丸められる場合があります。

ID、口座番号、郵便番号のように計算しない桁列は文字列として設計します。金額や時刻は単位と精度を決め、受信後に想定範囲を検証します。

Unicode文字列とUTF-8

JSON文字列はUnicode文字を表せ、\uXXXXによるエスケープも使えます。エスケープは必須ではなく、UTF-8で日本語をそのまま送れます。ネットワークで閉じたシステム間の相互運用にはUTF-8を使います。

対を成していないUTF-16のsurrogate(サロゲート/代用符号位置)を含む表現は、受信側によって結果が揃わない原因になります。有効なUnicodeスカラー値からなる文字列を生成し、比較前の正規化要件も定めます。

通信時のMIMEタイプ

JSON本文のMIMEタイプはapplication/jsonです。HTTPのContent-Typeで実際に送った表現を示し、受信側は状態、大きさ、構文、スキーマを順に検証します。

application/jsonには文字集合パラメーターを定義しません。JSONを含む独自メディアタイプでは+json接尾辞を使い、一般的なJSON処理が可能なことを示せます。

JSONはオブジェクト・配列・文字列・番号・真偽値・nullからなる厳密なテキスト構文です。順序、重複キー、数値精度、文字列の妥当性を、データの意味と別に検証します。

JSONの文法・相互運用・UTF-8・media type:RFC 8259

関連用語