Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

JSON (JavaScript Object Notation) は JavaScript 構文のサブセットをベースにしたデータ交換フォーマットです。JSON は、拡張機能などを含む JavaScript ベースのアプリケーションを書くときに役立ちます。詳細は http://json.org/ をご覧ください。

ネイティブ JSON のサポートは、将来の JavaScript のバージョンで予定されています (バグ 408838) 。

JSON のよいところは、オブジェクトを簡単に文字列の設定値として設定に格納できることです。

註: この記事の残りは、拡張機能や XUL アプリケーションの開発者向けに書かれています。

Firefox 2 における JSON

Firefox 2 には JSON のサポートが含まれていません。json.org からのコードを使用すると、バグ 397595 に関する問題などが起こります。そのため、json.org や JSON.jsm から、JSON オブジェクト (JSON のシリアライズや構文解析に使用します) を提供するコードを改造する必要があります。

Firefox 3 における JSON

Firefox 3 は nsIJSON インタフェースを導入しました。このインタフェースは JavaScript コードから使いやすい JSON 文字列のエンコードおよびデコードのサポートを提供します。また Firefox 3 は JSON.jsm という JSON のエンコードとデコードのための JavaScript コードモジュール も含んでいます。このコードモジュールは Components.utils.import を使ってインポートすることができます。

Date オブジェクトのシリアル化

Date オブジェクトは Firefox 3 では正しくシリアライズされません。例えば:

js> var Ci = Components.interfaces;
js> var Cc = Components.classes;
js> var nativeJSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
js> nativeJSON.encode({a:new Date()})
{"a":{}}

これは Firefox 3.5 で修正されています:

JSON.stringify({a:new Date()})
"{"a":"2009-07-17T13:41:55.414Z"}"

Firefox 3.5 における JSON

Firefox 3.5 は JSON.jsm JavaScript モジュールのサポートを取りやめました。これは ECMAScript 3.1 草案 のネイティブ JSON オブジェクトのサポートを支持したためです。詳しくは Firefox における JSON の利用 をご覧ください。

注: nsIJSON インタフェースはまだ Firefox 3.5 に含まれており、近い将来においてもそのままでしょう。ネイティブ JSON のサポートは nsIJSON をもとにしています。お好みのでしたら、引き続き nsIJSON に直接アクセスすることもできます。

Gecko 1.9.1 の JSON API を Gecko 1.9 で使う

Myk Melez は Gecko 1.9 と Gecko 1.9.1 の非互換な JSON API をラップした JavaScript モジュールを作成しました。これによって 1 つの API を書くだけで 2つのバージョンの Firefox をサポートすることができます。単に彼の JSON.js モジュールをこのようにインポートしてください:

let MyExtension = {
  JSON: null,
  ...
};
Components.utils.import("chrome://myextension/modules/JSON.js", MyExtension);

こうした後では、たとえ Firefox 3 でも MyExtension.JSONFirefox 3.5 JSON API で使うことができます。

これは Thunderbird 3 でも動作します。なぜなら Thunderbird 3 も Firefox 3.5 JSON API を使っているからです。

JSON を使う

短い警告

拡張機能などの特権コードを書く場合、信頼できないソースからの JSON 文字列 (実際にはどんな文字列であっても) を eval しないように注意してください。JSON デコーダ (これが最善策) か、 Components.utils.evalInSandbox, あるいは json.org の JSON.parse を利用してください。拡張機能における JSON と JavaScript のダウンロード をご覧ください。

JSON.jsm を使う

JavaScript オブジェクトをシリアライズするには:

Components.utils.import("resource://gre/modules/JSON.jsm");

var foo = {};
foo.bar = "new property";
foo.baz = 3;
var JSONfoo = JSON.toString(foo);

ここで、JSONfoo{"bar":"new property","baz":3} を保持しています。JSONfoo を JavaScript オブジェクトに戻すには次のようにします:

var backToJS = JSON.fromString(JSONfoo);

nsIJSON を使う

JavaScript オブジェクトをシリアライズするには:

var Ci = Components.interfaces;
var Cc = Components.classes;

var foo = {};
foo.bar = "new property";
foo.baz = 3;

var nativeJSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
var JSONfoo = nativeJSON.encode(foo);

ここで、JSONfoo{"bar":"new property","baz":3} を保持しています。JSONfoo を JavaScript オブジェクトに戻すには次のようにします:

var backToJS = nativeJSON.decode(JSONfoo);

ネイティブ JSON を使う

JavaScript オブジェクトをシリアライズするには JSON.stringify() メソッドを使ってください:

var foo = {};
foo.bar = "new property";
foo.baz = 3;

var JSONfoo = JSON.stringify(foo);

ここで、JSONfoo{"bar":"new property","baz":3} を保持しています。JSONfoo を JavaScript オブジェクトに戻すには次のようにします:

var backToJS = JSON.parse(JSONfoo);

制約事項

オブジェクトのメンバーに関数を持つものはシリアライズすることができません。JSON の仕様が許可していないためです。例えば:

foo.qwerty = function(){alert('foobar');};
foo.qwerty()
var JSONfoo = JSON.toString(foo);

は次のエラーを引き起こします: TypeError on line XXX: No JSON representation for this object!

参考

 

ドキュメントのタグと貢献者

 このページの貢献者: Taken, Mgjbot, Shoot, Marsf, Shimono, Okome
 最終更新者: Taken,