包 | 顶级 |
类 | public final class JSON |
继承 | JSON Object |
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 11, AIR 3.0 |
作为一种规则,ActionScript JSON 类符合 ECMA-262 规范。存在以下例外,其中 ActionScript 比 ECMAScript 提供更大的灵活性:
-
与 ECMAScript 不同,ActionScript JSON 类会对以下原始数据类型和包装它们的对象进行编码:
原始类型 包装类 字符串 字符串 number Number boolean Boolean -
parse()
方法:当传递到reviver
参数的变量不是函数时,ActionScript 将引发 TypeError,错误 ID 为kJSONInvalidReviver
。它还将发布一个本地化错误消息。 -
stringify()
方法:当传递到replacer
参数的变量既不是数组也不是函数时,ActionScript 将引发 TypeError,错误 ID 为kJSONInvalidReplacer
。它还将发布一个本地化错误消息。 -
stringify()
方法:当传递到space
参数的变量既不是字符串也不是数字时,会将其转为字符串。该字符串将充当输出中的间隙。ECMA-262 要求间隙必须为空字符串。 -
stringify()
方法:当代码遇到循环结构时,它将引发 TypeError,错误 ID 为kJSONCyclicStructure
。它还将发布一个本地化错误消息。 -
ECMA-262 指定 JSON 字符串化枚举对象“自己的属性”,即对象的动态属性。由于 ActionScript 类也可以声明固定属性,因此 ActionScript
stringify()
方法会在 ActionScript 对象上枚举动态属性和公共非瞬态属性。这些属性包括由 getter 访问的属性和直接访问的属性。
对于大多数 ActionScript 类,ActionScript JSON.stringify()
方法会生成默认编码。通过在类或其原型中定义 toJSON()
方法,ActionScript 类可更改此编码。对于少数 ActionScript 类,默认 JSON 编码不适合。这些类提供 toJSON()
的可覆盖的普通实现,该实现返回下表中描述的值。如果需要特定行为,可以覆盖或重新定义这些类中的 toJSON()
方法。下表说明了这些例外:
类 | 注释 |
---|---|
ByteArray | 可覆盖的 toJSON() 方法返回字符串“ByteArray”。 |
字典 | 可覆盖的 toJSON() 方法返回字符串“Dictionary”。 |
Date | 可覆盖的 toJSON() 方法返回 Date.toString() 。此例外保证 ActionScript Date 构造函数可以解析 JSON 字符串。 |
XML | 可覆盖的 toJSON() 方法返回字符串“XML”。 |
方法 | 由以下参数定义 | ||
---|---|---|---|
表示对象是否已经定义了指定的属性。 | Object | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
[静态]
接受 JSON 格式的字符串并返回表示该值的 ActionScript 对象。 | JSON | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
设置循环操作动态属性的可用性。 | Object | ||
[静态]
返回 JSON 格式的字符串,用于表示 ActionScript 值。 | 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 格式的字符串并返回表示该值的 ActionScript 对象。JSON 对象、数组、字符串、数字、布尔值和 null 映射到相应的 ActionScript 值,如下所示:
JSON 类型 | ActionScript 类型 |
---|---|
array | Array |
字符串 | 字符串 |
number | 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 |
返回 JSON 格式的字符串,用于表示 ActionScript 值。stringify
方法可以具有三个参数。
value
参数是必需的。此参数是一个 ActionScript 值。通常,它是一个对象或数组,但也可以是一个字符串、布尔值、数字或 null。
可选的 replacer
参数可以是一个函数,也可以是一个字符串或数字数组。如果是一个函数,则该函数具有两个参数:一个密钥和一个值。可以使用此函数在解析时转换或过滤每个密钥/值对。如果提供 replacer
函数,则 parse()
函数输出中将返回转换或过滤的每对值(而不是默认的解析值)。如果 replacer
函数对任何对返回 undefined
,则将从最终结果中删除该属性。如果 replacer
是一个数组,它将用作过滤器来指定在输出中包括哪些属性。
当传递到 replacer
参数的变量既不是数组也不是函数时,ActionScript 将引发 TypeError,错误 ID 为 kJSONInvalidReplacer
。它还将发布一个本地化错误消息。
可选的 space
参数是一个字符串或数字,用于将空格注入返回的字符串以改进用户阅读时的可读性。生成的 JSON 对象和 JSON 数组中的条目由 space
参数派生的间隙分隔。此间隙始终是 0 至 10 个字符宽。如果 space 是一个字符串,则派生的间隙是该字符串的前十个字符。如果 space 是一个非负数 x,则间隙是 x 个空格字符,最多为十个空格。当传递到 space
参数的变量既不是字符串也不是数字时,会将其转换为字符串,以用作输出中的间隙。然后继续执行。
当 stringify()
方法遇到循环结构时,它将引发 TypeError,错误 ID 为 kJSONCyclicStructure
。它还将发布一个本地化错误消息。
参数
value:Object — 要转换为 JSON 字符串的 ActionScript 值
| |
replacer:* (default = null ) — (可选)在 stringify 输出中转换或过滤密钥/值对的函数或数组
| |
space:* (default = null ) — (可选)控制在返回的字符串中添加的空格的字符串或数字
|
String |
JSONExample 类以 ActionScript 显示 JSON 往返行程。
这是由以下步骤完成的:
JSONExample
的构造函数向超类的text
成员分配了一个字符串,并初始化一个内部计数器。- 另外,该类还定义了一个数组,其中可以包含已经导出至 JSON 的 JSONExample 对象。
- JSONExample 还定义了
toJSON()
方法和revive()
方法。toJSON()
方法由JSON.stringify()
调用以便将 JSONExample 对象序列化到 JSON。可以从JSON.parse()
方法调用revive()
方法,以还原整个 JSONExample 对象。通过使用给定的 ID 从可复原对象数组中检索原始对象,从而实现了此还原。 - 使用该类定义的脚本创建了一个对象,其中包含两个 TextField 对象和一个 JSONExample 对象。它还创建一个可复原对象数组,用于存储已导出至 JSON 的 TextField 对象。
JSON.stringify()
的replacer
函数会将 TextField 对象从 JSON 字符串中过滤掉。代替每个已删除的对象,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, 11:04 AM Z