とほほのJSON入門
- JSONとは
- JSONの文法
- JSONのエンコーディング
- JSONの型
- 文字列("...")
- 数値(123, 12.3, 1.23e4)
- ヌル値(null)
- 真偽値(true, false)
- オブジェクト({...})
- 配列([...])
JSONとは
- JavaScript Object Notation の略です。
- RFC7158 と ECMA-404 1st edition では若干仕様の差異がありましたが、2017年12月に仕様の統一が行われ、RFC 8259, IETF STD 90, ECMA-404 2nd edition で再規定されました。
- MIMEタイプは application/json。拡張子は .json。
- JavaScript のデータ定義文をベースとした、簡易的なデータ定義言語です。
- JavaScript だけではなく、Java, PHP, Ruby, Python など、様々な言語間のデータ交換、特に Ajax や REST API などで使用されています。
- これまでは、共通データ定義言語として XML が利用されてきましたが、現在では、簡易的な JSON が利用されるケースが増えてきています。
- 子要素がひとつの場合、XML ではデータだけではそれが配列か否かを識別することはできませんが、JSON では配列と非配列を明確に指定することができます。
- JSON とよく比較されるフォーマットに YAML がありますが、実は JSON は YAML のサブセットだったりします。
- 文字コードは UTF-8 固定。
- バイトオーダーマーク (BOM) を先頭につけてはならない。
JSONの文法
よく利用されるケースとしては、{ ... } の中に、変数名と値をコロン(:)で区切り、下記の様に記述します。
{ "name": "Tanaka" }
カンマ(,)で連結することにより、複数の変数名と値のペアを指定することができます。
{ "name": "Tanaka", "age": 26 }
変数名(name や age)はダブルクォーテーション(")で囲みます。JavaScript ではシングルクォーテーション(')で囲んだり、変数名をそのまま記述することができますが、JSON ではダブルクォーテーションのみとなります。
○ { "name": "Tanaka", "age": 26 } × { 'name': "Tanaka", 'age': 26 } × { name: "Tanaka", age: 26 }
読みやすさのために、インデントをつけて表記されることも多いようです。インデントは 4文字スペースや 2文字スペースがよく用いられます。
{ "name": "Tanaka", "age": 26 }
下記の様に、配列や値のみの表記も JSON に従ったデータとして認められます。
○ ["ABC", "DEF"] ○ "ABC" ○ 123
JSONのエンコーディング
過去の仕様では単に Unicode が推奨され、先頭の 2バイトで UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE を見分けるとされていましたが、RFC 8259 で指定された仕様では、BOM 無しの UTF-8 で記述する(MUST)と定義されています。
JSONの型
JSON では下記の型を使用することができます。
文字列("...")
ダブルクォーテーション(")で囲んだ文字列を指定します。
{ "name": "Tanaka" }
文字としては、0x00~0x1F までの制御文字、ダブルクォーテーション(")、バックスラッシュ(\)を除く、UTF-8 でエンコードした Unicode 文字列を使用できます。サロゲートペアも使用可能です。ダブルクォーテーション(")、バックスラッシュ(\)を使用するには、下記のエスケープシーケンスを使用します。
- \" ... ダブルクォーテーション(")
- \\ ... バックスラッシュ(\)
- \/ ... スラッシュ(/) ... 単にスラッシュ(/)のみを記述することも可能
- \b ... バックスペース
- \f ... フォームフィード
- \n ... ラインフィード
- \r ... キャリッジリターン
- \t ... タブ
- \uXXXX ... Unicode文字(UTF-8でエンコードした文字でも可能)
数値(123, 12.3, 1.23e4)
123, 12.3, 1.23e3 などの数値を指定します。
{ "age": 26, "pi": 3.14, "planck_constant": 6.62607e-34 }
数値は IEEE 754 の 64ビット倍精度の数値として扱われます。整数の場合は -2^53+1(-9,007,199,254,740,991)~2^53-1(9,007,199,254,740,991) の精度を扱うことができます。浮動小数の場合は、仮数部53ビット(10進数で15~16桁)、指数部11ビット(10進数で-1022~+1023)の精度を扱うことができます。精度を超える場合は丸め誤差が発生します。
ヌル値(null)
値が無いことを示すヌル値を null で指定します。null はすべて小文字で指定します。
{ "name": null }
真偽値(true, false)
真偽を true または false で指定します。true や false はすべて小文字で指定します。
{ "active_flag": true, "delete_flag": false }
オブジェクト({...})
オブジェクトを {...} で指定します。オブジェクトは階層構造を持つことができます。
{ "user_info": { "user_id": "A1234567", "user_name": "Yamada Taro" } }
配列([...])
配列を [...] で指定します。配列要素には、文字列、数値、ヌル値、真偽値、オブジェクト、配列すべてを使用することができます。
{ "color_list": [ "red", "green", "blue" ], "num_list": [ 123, 456, 789 ], "mix_list": [ "red", 456, null, true ], "array_list": [ [ 12, 23 ], [ 34, 45 ], [ 56, 67 ] ], "object_list": [ { "name": "Tanaka", "age": 26 }, { "name": "Suzuki", "age": 32 } ] }