JSONについて
JSON (JavaScript Object Notation)は、データ交換フォーマットの一種で、 名前にはJavaScriptと入っているが、現在ではJavaScriptに限らず、 各種プログラム言語で利用できる。
特徴としては、テキスト形式で可読性が高いこと、単純で軽量なことなどが挙げられます。 JSONは、同様にテキストベースであるXML(Extensible Markup Language)と比べてもよりシンプルであり、 各種言語との親和性も高く使い勝手も良いことから、 最近はWebアプリケーションなどで利用されている。
JSONのフォーマットでは、四つの基本的な型(文字列、数値、ブール値、null値)と、 二つの構造型(オブジェクト、配列)を表現できます。 単純なため、JSONはJavaScriptだけではなく、 C、C++、Objective-C、Java、Perl、Ruby、Pythonなど、 現在は多数の言語で利用可能になっている。そのため、これらの言語をまたいで、 あるいはネットワークを通して、データを交換できる。
JSONの文法
{ ... } の中に、変数名と値をコロン(:)で区切り、下記の様に記述する。
{ "name": "Yamada" }
カンマ(,)で連結することにより、複数の変数名と値のペアを指定することができる。
{ "name": "Yamada", "age": 28 }
変数名(name や age)はダブルクォーテーション(")で囲む。JavaScript ではシングルクォーテーション(')で囲んだり、変数名をそのまま記述することができますが、JSON ではダブルクォーテーションのみとなる。
○ { "name": "Yamada", "age": 28 }
× { 'name': "Yamada", 'age': 28 }
× { name: "Yamada", age: 28 }
読みやすさのために、インデントをつけて表記されることも多いようです。インデントは 4文字スペースや 2文字スペースがよく用いられる。
{
"name": "Yamada",
"age": 28
}
下記の様に、配列や値のみの表記も 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 では下記の通りである
文字列 ("...")
数値 (123, 12.3, 1.23e4 など)
ヌル値 (null)
真偽値 (true, false)
オブジェクト ({ ... })
配列 ([...])
文字列("...")
ダブルクォーテーション(")で囲んだ文字列を指定します。
{ "name": "Yamada" }
文字としては、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 }
]
}