| 套件 | 最上層 |
| 類別 | 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
隱藏繼承公用屬性
顯示繼承公用屬性