昨今、JSONというキーワードを目にすることがますます増えたように感じます。この記事を参照くださった方も、
- JSONって何?
- JSONを読み書きできるようになりたい
といった疑問や要望をお持ちかと思います。幸いにもJSONの仕様は非常にシンプルなので学ぶのも簡単です。この機会に是非、習得してみてはいかがでしょうか。
この記事では JSON を誰でもわかるように基礎から解説していきたいと思います。
JSONとは?
JSONは、アプリケーションの構造化データをシリアル化するための言語です。出力されたJSONファイルは、他のアプリケーションに渡すためにも利用されるので、データ交換フォーマットの一種でもあります。
JSON(JavaScript Object Notationの略)は、その名の通りJavaScriptのオブジェクトを記述するフォーマットとして始まりました。しかし、JSONはシンプルでプログラムにも人間にも扱いやすいので、他のプログラミング言語でも広く利用されるようになりました。
競合するデータ交換フォーマットにはXML、YAML、CSVなどがあります。これらはデータの表現能力、人間が読み書きしやすい、アプリケーションの対応やライブラリの有無、処理速度などの特性に違いがありますので、アプリケーションの要件に従ってどれを用いるか決められます。
JSONは軽量で人間が読み書きしやすい構造化されたフォーマットで広く利用されています。
データ記述方法以外に知っておくべき仕様について
JSONのデータ(文字列、数値、ブール値、ヌル、オブジェクト、配列の6つ)の記述方法はこの後すぐに説明しますが、、それ以外に知っておくべき雑多な事柄についてはじめに説明します。
ホワイトスペースと構造を決める文字
JSONの仕様で定義されているホワイトスペースは次の4つです。
- 半角スペース
- 水平タブ
- 改行(ラインフィード)
- 復帰(キャリッジリターン)
データ構造を定義するための文字としては、次の6つが仕様で定義されています。
- {(左波括弧:オブジェクト開始文字)
- }(右波括弧:オブジェクト終了文字)
- [(左角括弧:配列開始文字)
- ](右角括弧:配列終了文字)
- :(コロン:名称区切り文字)
- ,(カンマ:値区切り文字)
これらデータ構造を定義するための文字の前後には、(意味を持たない)ホワイトスペースを幾つでも置くことができます。
値
JSONの値は文字列、数値、ブール値、ヌル、オブジェクト、配列のいずれかである必要があります。
オブジェクトは名前/値のペアで、配列は値のシーケンスなので、つまり、それらに使われる値がこれら6つのうちのいずれかである必要があるということです。
文字コード(文字エンコーディング)
JSONファイルの文字コードはUTF-8である必要があります。
JSONファイルの拡張子
JSONファイルの拡張子については、JSONの仕様では定義されていません。したがって決まりはないのですが、一般的には「.json」がよく使われます。
JSONデータの書き方
JSONは4つのプリミティブ型(primitive types)と2つの構造化型(structured types)を使ってデータを表現します。JSONのトップレベルはプリミティブ型でも構造化型でも構いません。
4つのプリミティブ型
JSONのプリミティブ型は次の4つです。
- 文字列
- 数値
- ブール値
- ヌル(null)
文字列
文字列は、0個以上のUnicode文字のシーケンスです。文字列はダブルクォーテーション(”)で囲みます。文字列にはすべてのUnicode文字が使えますが、次の文字を含める場合はエスケープする必要があります。
- ダブルクォーテーション(”)
- バックスラッシュ(\)
- U+0000からU+001Fの範囲の制御文字
文字列の中で使用できるエスケープシーケンスには次のものがあります。
エスケープシーケンス | 意味 |
---|---|
\” | ダブルクォーテーション |
\\ | バックスラッシュ |
\/ | スラッシュ |
\b | バックスペース |
\f | 改ページ(フォームフィード) |
\n | 改行(ラインフィード) |
\r | 復帰(キャリッジリターン) |
\t | 水平タブ |
\uXXXX | 任意のユニコード文字(XXXXはユニコードのコードポイント) |
数値
数値は10進数で表します。数値の前にはオプションのマイナス記号(-)を置くことができます。数値の前にゼロを置くことはできません。
以下は整数の例です。
0
243
-34
次のものはJSONの数値として正しくありません。0が先行したり、プラス記号(+)を置くことは認められていません。
01
+2
上記の整数(部)の後ろに小数部を続けることができます。小数部は小数点の後ろに1つ以上の数字が続きます。次の例で少数部を持つ数値の例です。
0.83
243.14
整数部や小数部の後には指数部を続けることができます。指数部はe
またはE
の後に、プラス記号(+)またはマイナス記号(-)を続けることができ、その後ろに1つ以上の数字が続きます。
10e3
1.24e-3
3.17E+2
ブール値
ブール値はtrue
またはfalse
のいずれかのリテラル値です。
ヌル(null)
ヌルは値が空であることを表します。ヌルはリテラル値のnull
で表します。
構造化型
JSONの構造化型は次の2つです。
- オブジェクト
- 配列
オブジェクト
オブジェクトは、0個以上の名前/値のペアの順不同のコレクションです。オブジェクトは、Javaではハッシュテーブル、Pythonであれば辞書のように言語のデータ構造にマップされます。
- 名前は文字列で、かつユニークである必要があります。
- 値は文字列、数値、ブール値、ヌル、オブジェクト、配列のいずれかです。
オブジェクトは、0個以上の名前/値のペアを中括弧で囲みます。名前と値はコロン(:)で区切ります。複数の名前/値のペアを含む場合は、それぞれをカンマ(,)で区切ります。
次はオブジェクトの例です。
{}
{ "one": 1 }
{ "one": 1, "two": 2 }
中括弧({、})、コロン(:)、カンマ(,)の前後には任意の数のホワイトスペースを置くことができます。
配列
配列は、0個以上の値の順序付きシーケンスです。配列は、Javaの配列、Pythonであればリストのような言語のデータ構造にマップされます。
配列は0個以上の値を角括弧で囲みます。複数の値はカンマ(,)で区切ります。配列の値には、すべてのデータ型(文字列、数値、ブール値、ヌル、オブジェクト、配列)が使えます。値の型は同じである必要はありません。
[]
[1]
[1, 2, "three"]
角括弧([、])、カンマ(,)の前後には任意の数のホワイトスペースを置くことができます。
JSONの文法をチェックする
JSONファイルの文法が正しいか(バリデーション)チェックするツールを紹介します。ここでは簡単に利用できるWeb上でチェックできるツールを紹介します。
使い方はサイトを訪れればすぐに変わるでしょう。
JSONファイルを手作業で修正したり、アプリケーションが出力したJSONファイルの文法をちょっと確認したいときに、このようなツールを利用すると良いでしょう。
JSONの例(RFC 8259から引用)
最後にJSONの例を示します。正確を期すためにRFC 8259の例を引用します。
次はオブジェクトの例です。
{ "Image": { "Width": 800, "Height": 600, "Title": "View from 15th Floor", "Thumbnail": { "Url": "http://www.example.com/image/481989943", "Height": 125, "Width": 100 }, "Animated" : false, "IDs": [116, 943, 234, 38793] } }
次の例は2つのオブジェクトを含む配列です。
[ { "precision": "zip", "Latitude": 37.7668, "Longitude": -122.3959, "Address": "", "City": "SAN FRANCISCO", "State": "CA", "Zip": "94107", "Country": "US" }, { "precision": "zip", "Latitude": 37.371991, "Longitude": -122.026020, "Address": "", "City": "SUNNYVALE", "State": "CA", "Zip": "94085", "Country": "US" } ]
次の例は値のみを含みます。
"Hello world!" 42 true
まとめ
JSONは非常にシンプルで人間にも読みやすいですが、データの表現能力は高くありません。XMLは反対になんでもデータを表現できてしまいますが、仕様はずっと複雑です。これらは通常トレードオフの関係にあるので、どちらかが優れているというものではありません。
この記事で紹介した汎用的なデータフォーマットでは、データの表現能力と複雑さが高い順に並べつと次のようになると思います。
- XML
- YAML
- JSON
- CSV
これらのデータフォーマットには一長一短がありますので、適材適所で使い分けると良いでしょう。
YAMLの書き方については次の記事で詳しく説明していますので、よろしかったら参照してみてください。
なお、JSONの仕様はIETFのRFC8259とECMA規格のECMA-404 2nd Editionで標準化されています。興味がある方は一読するのも良いかと思います。