JSON

JavaScript プログラムでは、外界とのデータの授受の標準形式として JSON を多用する。

JSON(JavaScript Object Notation)とは汎用的なデータ交換フォーマットで、 ECMA-404: http://www.ecma-international.org/publications/standards/Ecma-404.htm で定義されている。JavaScript 以外にも JSON 形式データを読み書きする機能が備わっているため幅広い分野で利用されている。

JavaScriptオブジェクト

JavaScriptでは、「プロパティ(キー)」と「値」の対の0個以上の集合を オブジェクト という。オブジェクトの値を表記するには、 この集合を中括弧 { } で括って表す。

{ プロパティ1: 2, ...  }

のような形で「プロパティ:値」の対をカンマ区切りで0個以上列挙する。 カンマは最後に余計につけても文法エラーにならない(下記の例参照)。

オブジェクト代入例

var x=2, s="hoge"	//  代入時の例に用いる
var obj = {	// ここからオブジェクトの即値表記
  'foo': 1,	// → foo: 1	(シングルクォート文字列でプロパティ指定)
  "bar": x,	// → bar: 2	(ダブルクォート文字列でプロパティ指定)
  baz:   s,	// → baz: "hoge"
  x,		// → x: 2	(変数は対が入る)
  3: 4,		// → '3': 2	(数値プロパティ)
  [s]: [s],	// → hoge: ["hoge"]
  // プロパティ部の [] は値展開され、値部の [] は通常どおり配列囲みを意味する
};

オブジェクトに備わる各プロパティへのアクセスには、 ピリオド表記と添字表記が利用できる。上記の変数 obj のプロパティ foo, 3 のそれぞれの値にアクセスするには以下のようにする。

// プロパティfoo へのアクセス:
obj.foo
obj['foo']
// プロパティ3 へのアクセス:
obj[3] (または obj['3'] で、obj.3 はNG)

プロパティが数値だったり、空白を含んだりする場合は添字アクセスに限る。

以上はオブジェクトをJavaScriptプログラム内で扱う場合の表現だが、 以下、オブジェクトをプログラムの外界とやりとりする場合の表現形式の JSON について説明する。

JSONの書式

JavaScript プログラム内でのオブジェクト表記の制約を強め、

としたものが JSON といえる。JSON で「値」に指定できる7種を示す。

オブジェクト

0個以上の「文字列 : 値」をカンマ区切りで列挙し { } で囲んだもの(つまりJSONで表現できるそのもの)

配列

0個以上の「値」をカンマ区切りで列挙し [ ] で囲んだもの

数値

10進の、123.45 のような固定小数点または 1.2345e2 のような指数表記によるもの(JavaScript で認められている Infinity や NaN はJSONの値には変換されず多くの処理系では null に置き換えられる)

文字列

ダブルクォートで囲まれた文字の並びで以下のエスケープシーケンスを使用できる

\"ダブルクォート自身
\\バックスラッシュ
\/スラッシュ
\bバックスペース文字
\n改行文字
\r復帰文字
\tタブ文字
\uXXXX 4桁16進でXXXXのコードの文字
true

真を表すシンボル(すべて小文字で表記)

false

偽を表すシンボル(すべて小文字で表記)

null

空を表すシンボル(すべて小文字で表記)

JSON変換関数

JavaScriptプログラム内のオブジェクトを JSON 文字列に、あるいはその逆の変換を行なうにはそれぞれ JSON.stringify(), JSON.parse() 関数を用いる。

JSON.stringify(オブジェクト[, 関数[, 空白]]

引数に指定したオブジェクトを JSON 文字列にする。 リストオブジェクト定義例の変数 obj を変換すると以下のようになる。

JSON.stringify(obj)
=> { '3': 4, foo: 1, bar: 2, baz: 'hoge', x: 2, hoge: [ 'hoge' ] }

JSON.stringify() への第2引数は、個別のプロパティと値を文字列化するときの挙動を変える 関数を指定するもので、第3引数は出力 JSON 文字列を1対1行ずつ出力するときの 行頭インデントに用いる文字列を指定するためのものである。

逆に、JSON 文字列として与えられたものを解析し JavaScript オブジェクトに変換するには JSON.parse() を用いる。

JSON.parse(文字列[, フィルタ関数])

引数に与えた 文字列 を解析し JavaScript オブジェクトに変換する。省略可能な第2引数には、 「プロパティ(キー)」と「値」の2つの引数を取る関数を指定でき、 その関数が return した値を「値」に置換することができる。

変換元の JSON 文字列が正しい書式でないと JSON.parse() は SyntaxError 例外を発生させる。プログラムの実行を止めたくない場合は try...catch で例外捕捉を行なう必要がある。