JSON (JavaScript Object Notation) は JavaScript 構文のサブセットをベースにしたデータ交換フォーマットです。JSON は、拡張機能などを含む JavaScript ベースのアプリケーションを書くときに役立ちます。詳細は https://json.org/ をご覧ください。
ネイティブ JSON のサポートは、将来の JavaScript のバージョンで予定されています (バグ 408838) 。
JSON のよいところは、オブジェクトを簡単に文字列の設定値として設定に格納できることです。
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.JSON
は Firefox 3.5 JSON API で使うことができます。
これは Thunderbird 3 でも動作します。なぜなら Thunderbird 3 も Firefox 3.5 JSON API を使っているからです。
JSON を使う
短い警告
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!
参考