JSONは、さまざまな言語/プラットフォーム間で軽量なデータ交換を行うのに利用可能なテキストフォーマットだ。
JSON(JavaScript Object Notation)は、さまざまな言語/プラットフォーム間で軽量なデータ交換を行うのに利用可能なテキストフォーマットだ。軽量かつ可読性が高いため、最近では各種の構成ファイルとして利用されることも多い。加えて、JSON形式のデータをサポートするデータベースなども多くなりつつある。
JSONは「JavaScriptにおけるオブジェクトリテラルの表記方法をベースとした、データ交換用のテキストフォーマット」である(JavaScript=ECMAScriptの以前の言語仕様である『Standard ECMA-262 3rd Edition』で規定されているオブジェクトリテラルの表記法のサブセットがベースとなっている)。JSON形式で記述されたデータはUnicodeのコードポイントで構成されるテキスト列となる。
JSONではオブジェクトを「{}」で囲んで表現する。「{}」内には0個以上の「名前: 値」という形式でメンバを記述できる(複数のメンバは「,」で区切って列挙していく)。
// 空のJSONオブジェクト
{}
// メンバが1つだけのJSONオブジェクト
{
"名前": 値
}
// 複数のメンバで構成されるJSONオブジェクト
{
"名前1": 値1,
"名前2": 値2,
…… 省略 ……,
"名前n": 値n
}
「名前」は文字列となる(JSONでは文字列はダブルクオートで囲んで表現する)。「値」には、以下のものを記述可能だ。
文字列内では「\n」(改行)、「\\」(バックスラッシュ)などのエスケープシーケンスも幾つか利用できる。また、「\u」に続けて4桁のUnicodeのコードポイントを記述して、特定の文字をコードポイントで表現することも可能だ(例えば、"\u2764"はハートを表現する)。
以下にJSON形式で記述したデータの例を示す。
{
"first_name": "shinji", // 文字列を値とするメンバ
"last_name": "kawasaki",
"address": { // オブジェクトを値とするメンバ(オブジェクトのネスト)
"country": "japan",
"prefecture": "tokyo",
"city": "setagaya-ku"
},
"age": 16, // 数値を値とするメンバ
"articles": [ // 配列を値とするメンバ
"devbasics keyword",
"using visual studio code",
"beginning python programming with visual studio"
],
"partner": null, // nullを値とするメンバ
"foolish": true, // trueを値とするメンバ
"cool": false // falseを値とするメンバ
}
これに対応するJavaScriptのオブジェクトリテラルは次のようになる。
var kawasaki = {
first_name: "shinji",
last_name: "kawasaki",
address: {
country: "japan",
prefecture: "tokyo",
city: "setagaya-ku"
},
age: 16,
articles: [
"devbasics keyword",
"using visual studio code",
"beginning python programming with visual studio"
],
partner: null,
foolish: true,
cool: false
};
JavaScriptのオブジェクトリテラルではプロパティ名に「識別子名」を記述できるため、JSON形式のデータにおける「名前」の部分にダブルクオートは不要だが、JSON形式のデータではダブルクオートは必須なところが大きく異なる(もちろん、JavaScriptのオブジェクトリテラルではプロパティ名に文字列リテラルも記述できる。その場合には、JavaScriptのオブジェクトリテラルとJSON形式のデータの記述に差異はない)。
余談だが、上のコードで「var kawasaki = 」がないと、{}で囲まれた部分はブロック(複合文)となり、その内部の「first_name:」などはラベルとして扱われるため、全体としては正しいJavaScriptコードにならない。
JSON形式のデータ(JSONテキスト)は、さまざまなプログラミング言語/プラットフォーム間でやりとりできる。やりとりしたデータはそれぞれの環境に固有なデータ構造に変換してから使用する。あるいは、環境に固有なデータ構造をJSON形式のデータに変換することで、他の環境にデータを受け渡すことになる。
例えば、JavaScriptではJSON.stringifyメソッドを使って、オブジェクトをJSON形式のデータにシリアライズできる。以下に例を示す。
var kawasaki = {
first_name: "shinji",
…… 省略 ……
cool: false
};
var jsondata = JSON.stringify(kawasaki);
console.log(jsondata);
# 出力結果(改行を適宜挿入したもの)
{"first_name":"shinji","last_name":"kawasaki","address":{"country":"japan",
"prefecture":"tokyo","city":"setagaya-ku"},"age":16,"articles":["devbasics
keyword","using visual studio code","beginning python programming with visual
studio"],"partner":null,"foolish":true,"cool":false}
これを見ると、JSON.stringifyメソッドでシリアライズされたデータには空白文字や改行文字がないことが分かる。JSONでは「不要な空白文字」は任意に挿入可能となっていて、可読性の高さが必要であれば(構成ファイルなど)それらを挿入すればよいし、ネットワークでのデータ転送において効率を重視するのであれば上記の出力結果のように空白文字を含める必要はない。
JSON形式のデータはJSON.parseメソッドを用いて、JavaScriptのオブジェクトにデシリアライズ可能だ。なお、JavaScriptでのJSONデータのシリアライズ/デシリアライズについては「.NET TIPS:JSONデータを解析するには?」も参照されたい。
var kawasaki = {
first_name: "shinji",
…… 省略 ……
cool: false
};
var jsondata = JSON.stringify(kawasaki);
var obj = JSON.parse(jsondata);
console.log(obj.articles);
# 出力結果
[ 'devbasics keyword',
'using visual studio code',
'beginning python programming with visual studio' ]
ここではJavaScriptでの例を見たが、JSON形式のデータをシリアライズ/デシリアライズするためのライブラリ/フレームワークは数多くの言語で提供されている。例えば、.NET Framework用のJSONフレームワークとして有名なのがJson.NETだ(本フォーラムの読者の方であればご存じだろう)。
JSON形式のデータを、実際にどのようなデータ構造に変換して扱うかは個々の言語やフレームワークに任されている。JSONはあくまでも言語やプラットフォームに独立なデータ構造を記述するためのフォーマットだ。そして、JSONフレームワークを活用することで、各種の言語/プラットフォームの間での軽量なデータ交換が可能となっている。
JSONは(JavaScriptから生まれたものではあるが)言語やプラットフォームに独立なデータフォーマットであり、これを利用することでさまざまな言語/プラットフォーム間で軽量なデータ交換が行える。また、最近では構成ファイル、データベースなど、さまざまな分野で利用されるようになっている。
Copyright© Digital Advantage Corp. All Rights Reserved.