JSONは、最近のWebサービスやNoSQLシステムなどでよく使われている、軽量なデータ交換用フォーマット。その概要を解説する。
「JSON(JavaScript Object Notation)」(ジェイソン)は、Webサービスなどでよく使われる、軽量なデータ交換用のフォーマットである。受け渡ししたいデータをシンプルな規則に基づいてテキスト文字だけで表現しているので、さまざまなプログラム言語から簡単に扱える。また、デバッグなどのために人間がデータをそのまま直接読むことも可能である。
同様の用途に使われるデータ形式としてXMLがある。XMLはデータを格納するだけでなく、高度に構造化されたデータを表現したりマークアップ機能を含んだりと、かなり複雑な仕様になっている。それに比べるとJSONはシンプルで扱いやすく、データサイズも小さくなるため、AjaxやREST APIなどを使ったWebアプリケーションではJSON形式が使われることが多い。
またNoSQL系のシステムを中心に、最近ではJSONを利用できるデータベースシステムも普及しつつある。例えばApache CouchDBはJSON形式でデータを保存するし、MongoDBはJSONの上位互換のBSON型データ(JSONを拡張してバイナリ型をサポートしたもの。BSONの仕様はオープン)を扱えるようになっている。
JSONは、もともとはJavaScript(ECMAScript仕様 第3版)におけるデータ表現方法として利用されていたものである。JSON形式で表現したデータ、例えば「 { "name" : "apple", "price" : 100 } 」のような文字列表記は、簡単にJavaScriptのオブジェクトに変換できる。逆にJavaScriptのオブジェクトをJSON形式に変換することも簡単である(実際にはJSON処理用のライブラリなどを使うことが多い)。
JSONの仕様は、「Standard ECMA-404:The JSON Data Interchange Format, 1st Edition(October 2013)」と「RFC 7159:The JavaScript Object Notation (JSON) Data Interchange Format」で定義されている。
JSONは仕様がシンプルで実装しやすいため、現在ではJavaScriptに限らず、さまざまな言語やライブラリなどでJSON形式でのデータのやりとりがサポートされている。
以下にJSON形式で表現したデータの例を示しておく。JSONでは、このように「名前」と「値」のペアを並べる他、角括弧で囲んで列挙したり(配列)、中括弧や角括弧で囲んでネスト(階層化)させたりしてデータを表現する。
{
"id" : 123456,
"name" : "Yamaha Taroh",
"mail" : "yamada@mail.xxxxx.yyyyy.zzzz",
"address" : "Tokyo, Japan",
"tel" : [
{ "home" : "123-3456-7890" },
{ "mobile" : "234-567-8901" },
{ "fax" : "345-678-9012" },
],
"favorite food" : [ "牛丼", "カレー", "ビール" ]
}
JSONのデータはUTF-8コードで表現する。インデント(字下げ)は任意である。通常は改行なしでデータを送るし、コメントを付ける機能もないので、適当なフォーマッタやバリデータ(データ形式のチェックツール)に通さないと、そのままでは読みづらいかもしれない。
「名前」(を表す文字列)と「値」を「 : 」(コロン)でつないでペアにしたものをJSONでは「オブジェクト」と呼ぶ。これをカンマで区切って複数並べ、全体を中括弧(「 { 」と「 } 」)で囲んだものがJSON形式である。ただしRFC 7159の記述によると、名前なしの単独の「値」だけでも、有効なJSON形式として扱われることになっている(古いRFCでは、トップレベルには「オブジェクト」か「配列」のみが許可されていた)。
JSONで扱える「値」には次の7種類がある。
値 | 意味 |
---|---|
オブジェクト | 「名前」を表す文字列と「 : 」「値」を組にしてカンマ区切りで並べ、全体を中括弧で囲んだものをオブジェクトという。値としてオブジェクトを指定すると、階層的なデータ構造(構造体)を表現できる |
配列 | 「 [ 」 と「 ] 」で囲み、「値」をカンマで区切って並べる |
数字 | 整数もしくは浮動小数点数。10進数表記のみ可 |
文字列 | UTF-8で表現された文字を引用符「 " 」で囲んだもの。文字列中で特殊文字を使いたい場合は次のように「 \ 」記号でエスケープする ・「 \" 」引用符 ・「 \\ 」バックスラッシュ ・「 \/ 」スラッシュ ・「 \b 」バックスペース ・「 \f 」フォームフィード ・「 \n 」改行 ・「 \r 」復帰 ・「 \t 」タブ ・「 \uNNNN 」Unicode文字コードの直接指定(NNNN は4桁の16進数) |
true | 論理値の「真」。すべて小文字で表記すること |
false | 論理値の「偽」。すべて小文字で表記すること |
null | 値が空であることを表す。すべて小文字で表記すること |
JSONの値のタイプ |
上記以外のデータ、例えばバイナリデータや日付/時刻型、通貨型のようなデータを表現するための書式は用意されていない。必要なら文字列や数値、およびそれらの複合型として表現することになるだろう。処理系やライブラリによっては文字列と日付を変換するような機能や、バイナリデータ型などの拡張機能を持っているものがあるが、どこでも使えるわけではない点に注意が必要である。
JSONでやりとりされるデータの型を定義したものを「JSONスキーマ」という。JSONは基本的には「スキーマレス」なデータ表現形式であるが、JSONスキーマがあれば、アプリケーションがどのようなデータを要求しているかが分かる。また、取得したJSONデータが正しいかどうか検証したり、JSONデータをやりとりするAPIの仕様書をまとめたりするときにも有用である。
JSONスキーマの仕様は現在標準化に向けて作業中であり、まだ正式には承認されていないものの、既に広く使われている(標準化の状況については json-schema.org 参照)。
JSONスキーマでは、JSONの書式をベースにしてスキーマを表現している。以下にJSONスキーマの例を示しておく。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Example Schema",
"type": "object",
"properties": {
"firstName": { "type": "string" },
"lastName": { "type": "string" },
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
}
},
"required": ["firstName", "lastName"]
}
「title」と「description」は説明のための項目であり、最終的なJSONデータには含まれない。「$schema」はスキーマのバージョン、「type」はJSONの値の型、「required」は省略不可能な項目を表す。
以上、JSONについて簡単に見てきた。AjaxやRESTful API、NoSQLの普及などでJSONの重要性はますます増えていると言えるだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.