套件 | 最上層 |
類別 | public final class JSON |
繼承 | JSON Object |
語言版本: | ActionScript 3.0 |
執行階段版本: | Flash Player 11, AIR 3.0 |
基於規定,ActionScript JSON 類別會遵循 ECMA-262 規格。當 ActionScript 提供比 ECMAScript 更好的彈性時,會發生下列例外:
-
不同於 ECMAScript,ActionScript JSON 類別會編碼下列基本資料類型以及包裝的物件:
基本類型 Wrapper 類別 字串 字串 數字 Number boolean Boolean -
parse()
方法:當傳遞至reviver
參數的引數不是函數時,ActionScript 會擲回 TypeError,錯誤 ID 為kJSONInvalidReviver
。同時會張貼當地語系化錯誤訊息。 -
stringify()
方法:當傳遞至replacer
參數的引數不是陣列或函數時,ActionScript 會擲回 TypeError,錯誤 ID 為kJSONInvalidReplacer
。同時會張貼當地語系化錯誤訊息。 -
stringify()
方法:當傳遞至space
參數的引數不是 String 或 Number 時,會轉換為 String。此字串做為輸出中的間隔。ECMA-262 需要間隔才能成為空字串。 -
stringify()
方法:當程式碼遇到循環結構時,會擲回 TypeError,錯誤 ID 為kJSONCyclicStructure
。同時會張貼當地語系化錯誤訊息。 -
ECMA-262 指定 JSON 字串規格列舉物件的「自有屬性」,即物件的動態屬性。由於 ActionScript 類別也可以宣告固定屬性,因此,ActionScript
stringify()
方法會列舉 ActionScript 物件上的動態屬性及公用非暫時性屬性。這些屬性包括透過 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 Object。 | 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 Object。JSON 物件、陣列、字串、數字、Boolean 和 null 會對應至對應的 ActionScript 值,如下所示:
JSON 類型 | ActionScript 類型 |
---|---|
array | Array |
字串 | 字串 |
數字 | Number |
boolean | Boolean |
null | null |
reviver
參數是接受兩個參數 (索引鍵和值) 的函數。您可以使用此函數來轉換或篩選每個已剖析的索引鍵值配對。如果您提供 reviver
函數,parse()
函數輸出中就會傳回為每個配對所轉換或篩選 (而非預設剖析) 的值。如果 reviver
函數針對任何配對都傳回 undefined
,則最後結果中會刪除屬性。
當傳遞至 reviver
參數的引數不是函數時,ActionScript 會擲回 TypeError,錯誤 ID 為 kJSONInvalidReviver
。同時會張貼當地語系化錯誤訊息。
如果 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
方法可以接受三個參數。
value
參數是必要的。此參數是 ActionScript 值。通常會是 Object 或 Array,但也可以是 String、Boolean、Number 或 null。
選擇性 replacer
參數可以是函數或是字串或數字的陣列。如果是函數,則接受兩個參數:索引鍵和值。您可以使用此函數來轉換或篩選每個已剖析的索引鍵值配對。如果您提供 replacer
函數,parse()
函數輸出中就會傳回為每個配對所轉換或篩選 (而非預設剖析) 的值。如果 replacer
函數針對任何配對都傳回 undefined
,則最後結果中會刪除屬性。如果 replacer
是陣列,則可做為篩選器,用來指定哪些屬性要包含在輸出中。
當傳遞至 replacer
參數的引數不是陣列或函數時,ActionScript 會擲回 TypeError,錯誤 ID 為 kJSONInvalidReplacer
。同時會張貼當地語系化錯誤訊息。
選擇性 space
參數是能在傳回的字串中插入空白字元以改善可讀性的 String 或 Number。產生的 JSON 物件和 JSON 陣列中的項目,是以衍生自 space
參數的間隔分隔。此間隔的寬度永遠介於 0 到 10 個字元。如果 space 是字串,衍生的間隔便是該字串的前十個字元。如果 space 是非負的數字 x,則間隔是 x 個空格字元,最大十個空格。當傳遞至 space
參數的引數不是 String 或 Number 時,會轉換為 String,做為輸出中的間隔。然後,執行會繼續。
當 stringify()
方法遇到循環結構時,會擲回 TypeError,錯誤 ID kJSONCyclicStructure
。同時會張貼當地語系化錯誤訊息。
參數
value:Object — 要轉換為 JSON 字串的 ActionScript 值
| |
replacer:* (default = null ) — (選擇性) 會轉換或篩選 stringify 輸出中之索引鍵值配對的函數或陣列
| |
space:* (default = null ) — (選擇性) 控制傳回之 String 中所新增空白字元的字串或數字
|
String |
JSONExample
類別,在 ActionScript 中顯示 JSON 往返流程。您可以使用下列步驟:
JSONExample
的建構函式將一個字串指定給父類別的text
成員,並初始化內部計數器。- 此外,該類別會定義一個陣列,其中包含已匯出至 JSON 的 JSONExample 物件。
- JSONExample 也會定義
toJSON()
方法與revive()
方法。toJSON()
方法是由JSON.stringify()
呼叫,以將 JSONExample 物件序列化為 JSON。revive()
方法可以從JSON.parse()
方法呼叫,以還原完整 JSONExample 物件。使用特定 ID 從可復原的物件陣列擷取原始物件,便可完成還原。 - 使用類別定義的指令碼會建立一個物件,其中包含兩個 TextField 物件與一個 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, 03:47 PM Z