houdinime

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

XML虽然强大但有人觉得xml不够简洁,编码和解码也有一定难度,于是21世纪初有人发明了JSON编码,相比xml内容少并且容易阅读,编码解码的难度也比xml简单,因此迅速得到普及成为比xml更加受欢迎的编码格式。JSON编码来源于对数据结构的分析,所有数据结构都可以分为3种基本数据组成单位:

 

第一种类型是标量,也就是一个单独的字符串或数字。

第二种类型是序列,也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组或列表

第三种类型是映射,也就是一个名/值对,又称作关联数组(Object或字典(Dictionary

 

几乎所有语言都有这三种类型,as3也不例外,这是JSON成为通用的编码格式基础,JSON提出如下规范:

 

1.并列的数据之间用逗号("")分隔。

2.映射用冒号("")表示。

3.并列数据的集合(数组)用方括号("[]")表示。

4.映射的集合(对象)用大括号("{}")表示。

 

这符合像c++,javac#,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数据}...]
}

 

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编码,需要下载AdobeJSON工具包,下载完后就可以使用JSON类编码和解码,JSON使用起来也非常简单,它仅包括两个静态方法:JSON.encode(o:Object):StringJSON.decode( s:String, strict:Boolean = true ):*,endode()可以将关联数组、Array转化为字符串,decode()可以将json格式的字符串转化为Objectstrict用于严格检查,如果格式不标准会报JSONParseError的错误,下面是使用JSON编码和解码的例子:

 

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
					   xmlns:s="library://ns.adobe.com/flex/spark" 
					   xmlns:mx="library://ns.adobe.com/flex/mx"
					   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);
				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 ); 
				trace( jsonStr2 );
				
				getJSON();
			} 
			
			public function getJSON():void{
				var urlLoader:URLLoader = new URLLoader();
				urlLoader.load(new URLRequest( "model/ssss.php"));
				urlLoader.addEventListener(Event.COMPLETE, decodeJSONHandler);
				
			}
			private var sss:Object=new Object();
			
			private function decodeJSONHandler(event:Event):void{
				var jsonArray:Array = com.adobe.serialization.json.JSON.decode( URLLoader( event.target ).data );
				trace(jsonArray);
				
				for (var i:int=0; i<jsonArray.length; i++) {
					trace( jsonArray[i] .firstName);
				}
			}
			
		]]>
	</fx:Script>
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
</s:WindowedApplication>

ssss.php

[{"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 值。

 

 

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
					   xmlns:s="library://ns.adobe.com/flex/spark" 
					   xmlns:mx="library://ns.adobe.com/flex/mx"
					   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>

 

 


posted on 2013-03-11 01:53  houdinime  阅读(1110)  评论(0编辑  收藏  举报