XML虽然强大但有人觉得xml不够简洁,编码和解码也有一定难度,于是21世纪初有人发明了JSON编码,相比xml内容少并且容易阅读,编码解码的难度也比xml简单,因此迅速得到普及成为比xml更加受欢迎的编码格式。JSON编码来源于对数据结构的分析,所有数据结构都可以分为3种基本数据组成单位:
第一种类型是标量,也就是一个单独的字符串或数字。
第二种类型是序列,也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组或列表
第三种类型是映射,也就是一个名/值对,又称作关联数组(Object或字典(Dictionary)
几乎所有语言都有这三种类型,as3也不例外,这是JSON成为通用的编码格式基础,JSON提出如下规范:
1.并列的数据之间用逗号(",")分隔。
2.映射用冒号(":")表示。
3.并列数据的集合(数组)用方括号("[]")表示。
4.映射的集合(对象)用大括号("{}")表示。
这符合像c++,java,c#,javascript等常用语言的编写习惯,as3也不例外,例如:
[
{"姓名":"张三","性别":"男","年纪":28},
{"姓名":"四凤","性别":女,"年纪":24}
]
{
"backgroundPic":"aaaa",
"mapBounds":{"x":10,"y":20},
"hero":{这里写你的英雄数据},
"secnceVec":[{场景1数据},{场景2数据}...],
"monsterVec":[{怪物1数据},{怪物2数据}...],
"coinVec":[{金币1数据},{金币2数据}...],
"whoYourDadVec":[{无敌药水1数据},{无敌药水2数据}...],
"bouncyPointVec":[{弹簧点1数据},{弹簧点2数据}...]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
package
gameElements.data
{
import
flash.geom.Point;
/**
* 一个关卡包含的数据
* */
public
class
Ele_MissionData
{
/**
* 背景图片
* */
public
var
backgroundPic:
String
;
/**
* 地图大小
* */
public
var
mapBounds:Point;
/**
* 英雄数据
* */
public
var
hero:Ele_Hero_Data;
/**
* 场景数据
* */
public
var
secnceVec:Vector.<Ele_Secnce_Data>;
/**
* 怪物数据
* */
public
var
monsterVec:Vector.<Ele_Monster_Data>;
/**
* 金币数据
* */
public
var
coinVec:Vector.<Ele_Coin_Data>;
/**
* 无敌药水数据
* */
public
var
whoYourDadVec:Vector.<Ele_WhosYourDad_Data>;
/**
* 弹簧点数据
* */
public
var
bouncyPointVec:Vector.<Ele_BouncyPoint_Data>;
}
}
|
这个结构和as3的字面值非常相似,因此使用as3编写JSON有非常大的优势,目前as3中还没有内置JSON编码,需要下载Adobe的JSON工具包,下载完后就可以使用JSON类编码和解码,JSON使用起来也非常简单,它仅包括两个静态方法:JSON.encode(o:Object):String和JSON.decode( s:String, strict:Boolean = true ):*,endode()可以将关联数组、Array转化为字符串,decode()可以将json格式的字符串转化为Object,strict用于严格检查,如果格式不标准会报JSONParseError的错误,下面是使用JSON编码和解码的例子:
ssss.php
1
2
3
|
[{
"firstName"
:
"Isaac"
,
"lastName"
:
"Asimov"
,
"genre"
:
"sciencefiction"
},
{
"firstName"
:
"Tad"
,
"lastName"
:
"Williams"
,
"genre"
:
"fantasy"
},
{
"firstName"
:
"Frank"
,
"lastName"
:
"Peretti"
,
"genre"
:
"christianfiction"
}]
|
[SWF] test_json.swf - 2,137,848 bytes after decompression
zhanzhihu
34
0,1,2,3
zhanzhihu
{"lastName":"Gate","firstName":"bill","com":"Microsoft"}
[object Object],[object Object],[object Object]
Isaac
Tad
Frank
[Unload SWF] test_json.swf
flex 4.6 默认添加了json:
parse(text:String, reviver:Function = null):Object [静态] 接受 JSON 格式的字符串并返回表示该值的 ActionScript 对象。 |
JSON |
stringify(value:Object, replacer:* = null, space:* = null):String [静态] 返回 JSON 格式的字符串,用于表示 ActionScript 值。 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<s:WindowedApplication xmlns:fx=
"http://ns.adobe.com/mxml/2009"
creationComplete=
"init()"
>
<fx:Script>
<![CDATA[
//import com.adobe.serialization.json.*;
private
var
jsonStr:
String
;
private
var
jsonObj:
Object
;
private
var
jsonObj2:
Object
;
private
var
jsonStr2:
String
;
private
var
jsonObj3:
Object
;
internal
function
init():
void
{
jsonStr =
'{"name":"zhanzhihu","age":22,"gender":"male","arr":[0,1,2,3]}'
;
jsonObj =
new
Object
();
//jsonObj = com.adobe.serialization.json.JSON.decode(jsonStr);
jsonObj = JSON.parse(jsonStr);
trace
(jsonObj.name);
trace
(jsonObj.age +
12
);
trace
(jsonObj.arr);
trace
(jsonObj[
"name"
]);
jsonObj2 =
new
Object
();
jsonObj2.firstName =
"bill"
;
jsonObj2.lastName =
"Gate"
;
jsonObj2.com =
"Microsoft"
;
//jsonStr2 = com.adobe.serialization.json.JSON.encode( jsonObj2 );
jsonStr2 = JSON.stringify(jsonObj2);
trace
( jsonStr2 );
}
]]>
</fx:Script>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
</s:WindowedApplication>
|