連載
» 2016年10月27日 05時00分 UPDATE

Dev Basics/Keyword:JSON(JavaScript Object Notation)

JSONは、さまざまな言語/プラットフォーム間で軽量なデータ交換を行うのに利用可能なテキストフォーマットだ。

[かわさきしんじ,Insider.NET編集部]
「Dev Basics/Keyword」のインデックス

連載目次

 JSON(JavaScript Object Notation)は、さまざまな言語/プラットフォーム間で軽量なデータ交換を行うのに利用可能なテキストフォーマットだ。軽量かつ可読性が高いため、最近では各種の構成ファイルとして利用されることも多い。加えて、JSON形式のデータをサポートするデータベースなども多くなりつつある。

ECMA-404(ECMAが定めるJSON仕様)によるとJSONの概念はJSON.orgで初めて提唱された ECMA-404(ECMAが定めるJSON仕様)によるとJSONの概念はJSON.orgで初めて提唱された

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オブジェクト

 「名前」は文字列となる(JSONでは文字列はダブルクオートで囲んで表現する)。「値」には、以下のものを記述可能だ。

  • オブジェクト(オブジェクト内にオブジェクトをネストできる)
  • 配列(カンマ区切りの「値」の列を「[]」で囲んだもの。配列のネストも可能)
  • 数値(数字/小数点/指数表記で構成される任意のサイズの10進数)
  • 文字列(Unicodeのコードポイントの連なりをダブルクオートで囲んだもの)
  • true/false(真偽値)
  • null(そのメンバに値がないことを意味する)

 文字列内では「\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を値とするメンバ
}


JSON形式のデータの例

 これに対応する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のオブジェクトリテラル

 JavaScriptのオブジェクトリテラルではプロパティ名に「識別子名」を記述できるため、JSON形式のデータにおける「名前」の部分にダブルクオートは不要だが、JSON形式のデータではダブルクオートは必須なところが大きく異なる(もちろん、JavaScriptのオブジェクトリテラルではプロパティ名に文字列リテラルも記述できる。その場合には、JavaScriptのオブジェクトリテラルとJSON形式のデータの記述に差異はない)。

 余談だが、上のコードで「var kawasaki = 」がないと、{}で囲まれた部分はブロック(複合文)となり、その内部の「first_name:」などはラベルとして扱われるため、全体としては正しいJavaScriptコードにならない。

JSONデータのシリアライズとデシリアライズ

 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.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' ]

JSON.parseメソッドによるデシリアライズ

 ここではJavaScriptでの例を見たが、JSON形式のデータをシリアライズ/デシリアライズするためのライブラリ/フレームワークは数多くの言語で提供されている。例えば、.NET Framework用のJSONフレームワークとして有名なのがJson.NETだ(本フォーラムの読者の方であればご存じだろう)。

 JSON形式のデータを、実際にどのようなデータ構造に変換して扱うかは個々の言語やフレームワークに任されている。JSONはあくまでも言語やプラットフォームに独立なデータ構造を記述するためのフォーマットだ。そして、JSONフレームワークを活用することで、各種の言語/プラットフォームの間での軽量なデータ交換が可能となっている。


 JSONは(JavaScriptから生まれたものではあるが)言語やプラットフォームに独立なデータフォーマットであり、これを利用することでさまざまな言語/プラットフォーム間で軽量なデータ交換が行える。また、最近では構成ファイル、データベースなど、さまざまな分野で利用されるようになっている。

参考資料

  • JSON.org: JSONの概念が初めて提起された
  • ECMA-404: ECMAによるJSONの仕様
  • JSON Schema: JSON形式のデータの構造を定義するのに使用されるJSONスキーマの策定作業を行っている
  • JSON(ジェイソン): @IT内のキーワード解説記事

「Dev Basics/Keyword」のインデックス

Dev Basics/Keyword

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。