JSONとは
JSON(JavaScript Object Notation/ジャバスクリプト・オブジェクト・ノーテーション/ジェイソン)は、オブジェクトと配列を、文字列・数値・真偽値などで表す軽量なテキストデータ形式です。
APIの要求・応答、設定、保存データなどで使われます。名前にJavaScriptを含みますが、多くのプログラミング言語にパーサーと生成ライブラリーがあります。
JSONはデータの構文を決めますが、その値が氏名か日時か金額か、必須かどうかまでは決めません。意味と制約はAPI仕様やJSON Schemaなどで別に定めます。

JSONで使える値は六種類
文字列の名前と値をメンバーとして波括弧内へ並べます。
角括弧内へ値を順に並べ、同じ型に限定されません。
二重引用符で囲み、制御文字などをエスケープします。
整数と小数を表せますが、受け手が正確に扱える範囲は別です。
引用符で囲まない二つの真偽値です。
項目自体がない状態とは区別される場合があります。
構文は短いが厳密
{
"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