パッケージ | トップレベル |
クラス | public final class JSON |
継承 | JSON Object |
言語バージョン: | ActionScript 3.0 |
ランタイムバージョン: | Flash Player 11, AIR 3.0 |
原則として、ActionScript JSON クラスは ECMA-262 仕様に従います。ActionScript のほうが ECMAScript より柔軟性が高い場合は、次の例外が発生します。
-
ECMAScript とは異なり、ActionScript JSON クラスでは、次のようなプリミティブデータ型およびそれらのラッパーオブジェクトをエンコードします。
プリミティブ型 ラッパークラス 文字列 String 数値 Number ブール値 Boolean -
parse()
メソッド:reviver
パラメーターに渡される引数が関数でない場合、ActionScript では、エラー IDkJSONInvalidReviver
で TypeError がスローされます。ローカライズされたエラーメッセージも表示されます。 -
stringify()
メソッド:replacer
パラメーターに渡される引数が配列でも関数でもない場合、ActionScript では、エラー IDkJSONInvalidReplacer
で TypeError がスローされます。ローカライズされたエラーメッセージも表示されます。 -
stringify()
メソッド:space
パラメーターに渡される引数が String や Number でない場合、String に変換されます。この文字列は出力における隙間の役割を果たします。ECMA-262 に従って、隙間を空白の文字列にする必要があります。 -
stringify()
メソッド:周期的な構成に遭遇すると、エラー IDkJSONCyclicStructure
で TypeError がスローされます。ローカライズされたエラーメッセージも表示されます。 -
ECMA-262 では、JSON の文字列化はオブジェクトの「独自のプロパティ」、つまり、オブジェクトの動的プロパティを列挙すると指定されています。ActionScript のクラスでは固定のプロパティも宣言されているので、ActionScript の
stringify()
メソッドは、ActionScript オブジェクトの動的プロパティと、transient ではないパブリックプロパティの両方を列挙します。これには、getter によってアクセスされるプロパティと、直接アクセスされるプロパティが含まれます。
ほとんどの ActionScript クラスでは、ActionScript の JSON.stringify()
メソッドによってデフォルトエンコーディングが生成されます。ActionScript クラスでは、クラスまたはそのプロトタイプで toJSON()
メソッドを定義することで、このエンコーディングを変更できます。ActionScript の一部のクラスでは、デフォルトの JSON エンコーディングが適切ではありません。これらのクラスには、次の表で示す値を返す、標準的でオーバーライド可能な toJSON()
実装が含まれています。固有の動作が必要な場合は、これらのクラスで toJSON()
メソッドをオーバーライドまたは再定義できます。これらの例外について次の表で説明します。
クラス | 説明 |
---|---|
ByteArray | オーバーライド可能な toJSON() メソッドで文字列「ByteArray」が返されます。 |
Dictionary | オーバーライド可能な toJSON() メソッドで文字列「Dictionary」が返されます。 |
Date | オーバーライド可能な toJSON() メソッドで Date.toString() が返されます。この例外では、ActionScript の Date コンストラクターが JSON 文字列を解析できることが保証されます。 |
XML | オーバーライド可能な toJSON() メソッドで文字列「XML」が返されます。 |
メソッド | 定義元 | ||
---|---|---|---|
オブジェクトに指定されたプロパティが定義されているかどうかを示します。 | Object | ||
Object クラスのインスタンスが、パラメーターとして指定されたオブジェクトのプロトタイプチェーン内にあるかどうかを示します。 | Object | ||
[静的]
JSON 形式の String を受け入れ、その値を表す ActionScript オブジェクトを返します。 | JSON | ||
指定されたプロパティが存在し、列挙できるかどうかを示します。 | Object | ||
ループ処理に対するダイナミックプロパティの可用性を設定します。 | Object | ||
[静的]
ActionScript の値を表す String を JSON 形式で返します。 | JSON | ||
ロケール固有の規則に従って書式設定された、このオブジェクトのストリング表現を返します。 | Object | ||
指定されたオブジェクトのストリング表現を返します。 | Object | ||
指定されたオブジェクトのプリミティブな値を返します。 | Object |
parse | () | メソッド |
public static function parse(text:String, reviver:Function = null):Object
言語バージョン: | ActionScript 3.0 |
ランタイムバージョン: | Flash Player 11, AIR 3.0 |
JSON 形式の String を受け入れ、その値を表す ActionScript オブジェクトを返します。JSON のオブジェクト、配列、文字列、数値、ブール値および null は、次のように対応する ActionScript 値にマップします。
JSON タイプ | ActionScript タイプ |
---|---|
配列 | Array |
文字列 | String |
数値 | Number |
ブール値 | Boolean |
null | null |
reviver
パラメーターは、キーと値の 2 つのパラメーターを取る関数です。この関数を使用すると、キーと値のペアを解析時に変換またはフィルタリングできます。reviver
関数を指定した場合、デフォルトの解析ではなく、各ペアの変換後またはフィルタリング後の値が parse()
関数の出力で返されます。いずれかのペアに関して reviver
関数が undefined
を返した場合、このプロパティは最終結果から削除されます。
reviver
パラメーターに渡される引数が関数でない場合、ActionScript では、エラー ID kJSONInvalidReviver
で TypeError がスローされます。ローカライズされたエラーメッセージも表示されます。
parse()
関数により、オブジェクト内で重複したキーが見つかった場合、最後に見つかったキーの値が、それまでに出現したすべての重複キーの値となります。
パラメーター
text:String — 解析対象の JSON 文字列
| |
reviver:Function (default = null ) — (オプション)解析対象のキーと値のペアを変換する関数
|
Object |
stringify | () | メソッド |
public static function stringify(value:Object, replacer:* = null, space:* = null):String
言語バージョン: | ActionScript 3.0 |
ランタイムバージョン: | Flash Player 11, AIR 3.0 |
ActionScript の値を表す String を JSON 形式で返します。stringify
メソッドは 3 つのパラメーターを取ります。
value
パラメーターは必須です。このパラメーターは ActionScript の値です。通常、これは Object または Array ですが、String、Boolean、Number または null を指定することもできます。
オプションの replacer
パラメーターは、文字列または数値の関数または配列です。関数の場合は、キーと値の 2 つのパラメーターを取ります。この関数を使用すると、キーと値のペアを解析時に変換またはフィルタリングできます。replacer
関数を指定した場合、デフォルトの解析ではなく、各ペアの変換後またはフィルタリング後の値が parse()
関数の出力で返されます。いずれかのペアに関して replacer
関数が undefined
を返した場合、このプロパティは最終結果から削除されます。replacer
が配列である場合は、出力に含めるプロパティを指定するためのフィルターとして使用されます。
replacer
パラメーターに渡される引数が配列でも関数でもない場合、ActionScript では、エラー ID kJSONInvalidReplacer
で TypeError がスローされます。ローカライズされたエラーメッセージも表示されます。
オプションの space
パラメーターは String または Number であり、返される文字列に空白を挿入できるため、読みやすさが向上します。生成される JSON オブジェクトと JSON 配列のエントリは、space
パラメーターから派生した隙間によって区切られます。この隙間の幅は常に 0 ~ 10 文字分です。空白が文字列である場合、派生する隙間はその文字列の最初の 10 文字です。空白が負ではない数値 x である場合、隙間は x 個の空白文字(最大 10 個まで)となります。space
パラメーターに渡される引数が String や Number でない場合は、出力で隙間として使用するために String に変換されます。その後実行が続行します。
stringify()
メソッドでは、周期的な構造に遭遇すると、エラー ID kJSONCyclicStructure
で TypeError がスローされます。ローカライズされたエラーメッセージも表示されます。
パラメーター
value:Object — JSON 文字列に変換される ActionScript 値
| |
replacer:* (default = null ) — (オプション)stringify 出力でキーと値のペアを変換またはフィルタリングする関数または配列
| |
space:* (default = null ) — (オプション)返された String に追加されている空白を制御する文字列または数値
|
String |
JSONExample
クラスを使用して、ActionScript での JSON ラウンドトリップを示しています。これを行うには、以下の手順を実行します。
JSONExample
のコンストラクタでは、スーパークラスのtext
メンバーに文字列を代入し、内部カウンターを初期化します。- さらに、このクラスには、JSON に書き出された JSONExample オブジェクトを格納できる配列が定義されています。
- JSONExample には、
toJSON()
メソッドとrevive()
メソッドも定義されています。toJSON()
メソッドは、JSONExample オブジェクトを JSON に直列化するためにJSON.stringify()
によって呼び出されます。revive()
メソッドは、完全な JSONExample オブジェクトを復元するためにJSON.parse()
メソッドから呼び出すことができます。この復元を行うには、指定された ID を使用して、回復可能なオブジェクトの配列から元のオブジェクトを取得します。 - このクラス定義を使用するスクリプトでは、2 つの TextField オブジェクトと 1 つの JSONExample オブジェクトを保有するオブジェクトが作成されます。また、JSON に書き出された TextField オブジェクトを保存するための回復可能なオブジェクトの配列も作成されます。
JSON.stringify()
のreplacer
関数は、フィルターを適用して JSON 文字列から TextField オブジェクトを除外します。replacer
は、削除されたオブジェクトのそれぞれの場所に ID を含むマーカーを付与します。このマーカーは、後でオブジェクトを取得するために使用できます。一方、JSONExample オブジェクトの場合は、ネイティブ JSON エンコーディングに従って渡されます。parse()
メソッドのreviver
関数は、参照されているすべての TextField および JSONExample オブジェクトを取得して、元のオブジェクトを再作成します。
package { import flash.text.TextField; public class JSONExample extends TextField { static var nextId = 10000; static var revivable_objects:Array = []; public var id; public function JSONExample(s:String){ super.text = s; id = ++nextId; } public function toJSON(k):* { // To be called internally by the JSON.stringify() method. // Save the original object internally. // Write out only a generated ID and the text value. revivable_objects[id] = this; return {"classJSONExample":{"reviveId":id,"contents":this.text}}; } public static function revive(id:int):JSONExample { // For explicit use in the JSON.parse() method. // Revives the object using the ID obtained from the JSON string. return revivable_objects[id]; } } } import flash.text.TextField; var lastId = 20000; var tf1:TextField = new TextField(); tf1.text = "Lorem ipsum"; var tf2:TextField = new TextField(); tf2.text = "Laughing cows"; var nt:JSONExample = new JSONExample("It was the best of times; it was the worst of times."); var obj:Object = {a:tf1, b:nt, c:tf2}; var revivable_objects:Array = new Array(); var json_out = JSON.stringify(obj, function(k,v){ if (v is JSONExample) { // Send JSONExample objects to the JSON output. // Note that stringify() calls JSONExample.toJSON() to serialize this object. return v; } if (v is TextField) { // Remove TextField objects from the JSON output. // Save the original object for reviving later. // Return a new object containing an identification marker // and the original object's revival ID. revivable_objects[++lastId] = v; return {"classTextField":{"reviveId":lastId}}; } return v; } ); trace("json_out: " + json_out); var json_in = JSON.parse(json_out, function(k,v) { if ("classTextField" in v) { // special marker tag from stringify() replacer code // Retrieve the original object based on the ID stored in the stringify() replacer function. var id = v["classTextField"].reviveId; return revivable_objects[id]; } else if ("classJSONExample" in v){ // Retrieve the original object based on the ID generated in JSONExample.toJSON(). return JSONExample.revive(v["classJSONExample"].reviveId); } return v; } ); if (json_in.a) { if (json_in.a.hasOwnProperty("text")) { trace("json_in.a: " + json_in.a.text); } } if (json_in.b) { if (json_in.b.hasOwnProperty("text")) { trace("json_in.b: " + json_in.b.text); } } if (json_in.c) { if (json_in.c.hasOwnProperty("text")) { trace("json_in.c: " + json_in.c.text); } }
Tue Jun 12 2018, 10:34 AM Z