as3corelib的JSON类的简单应用

        as3corelib是一个开源的as库,里面有很多有用的工具类,其中里面的JSON类可以将AS的对象转换成JSON的格式。

 

        JSON类只有两个静态方法: encode 和 decode。

 

        encode方法接受一个AS对象作为参数,然后把对象转换成JSON格式的字符串;decode方法接受一个JSON格式
的字符串,返回一个AS对象。下面是JSON类的具体用法:

package {

	import com.adobe.serialization.json.JSON;

	

	import flash.display.Sprite;

	import flash.utils.describeType;



	public class CorelibEx extends Sprite

	{

		public function CorelibEx() {

			jsonTest();

		}

		

		private function jsonTest():void {

			var person:Person = new Person("Joseph", 23, "Male");

			var jsonStr:String = JSON.encode(person);//普通对象转换成JSON字符串格式

			trace("jsonStr = " + jsonStr);//输出jsonStr = {"age":23,"sex":"Male","name":"Joseph"}

			

			var jsonObj:* = JSON.decode(jsonStr);//JSON字符串转化为AS对象

			trace("Name: " + jsonObj.name, "Age: " + jsonObj.age, "Sex: " + jsonObj.sex);

			

			trace(describeType(person));

		}

	}

}



class Person {

	private var _name:String;

	private var _age:int;

	private var _sex:String;

	

	public function Person(name:String=null, age:int=-1, sex:String=null) {

		_name = name;

		_age = age;

		_sex = sex;

	}

	

	public function get name():String {

		return _name;

	}

	

	public function set name(name:String):void {

		_name = name;

	}

	

	public function get age():int {

		return _age;

	}

	

	public function set age(age:int):void {

		_age = age;

	}

	

	public function get sex():String {

		return _sex;

	}

	

	public function set sex(sex:String):void {

		_sex = sex;

	} 

}

 

        实践过程中发现,如果改对象是自定义对象,则一定要给对象的属性加上getter 和 setter 方法,否则转换得到的JSON字符串则为:{}。

 

        通过查看corelib中JSON类的源代码,发现JSON类在encode操作时,调用的是JSONEncoder类,该类首先会判断对象所属的类型,当发现对象为自定义类型(归入Object类型)时,调用objectToString方法,顾名思义,该方法将对象转换成字符串。该方法首先会调用flash.util.descriptType方法,这个方法是将一个AS对象用XML的方法来描述,例如,对象person的XML描述是:

<type name="CorelibEx.as$0::Person" base="Object" isDynamic="false" isFinal="false" isStatic="false">
  <extendsClass type="Object"/>
  <constructor>
    <parameter index="1" type="String" optional="true"/>
    <parameter index="2" type="int" optional="true"/>
    <parameter index="3" type="String" optional="true"/>
  </constructor>
  <accessor name="sex" access="readwrite" type="String" declaredBy="CorelibEx.as$0::Person"/>
  <accessor name="name" access="readwrite" type="String" declaredBy="CorelibEx.as$0::Person"/>
  <accessor name="age" access="readwrite" type="int" declaredBy="CorelibEx.as$0::Person"/>
</type>

        XML的根节点描述了该类的名称、基类、是否动态类、是否Final类、是否Static类,<constructor>块描述的是构造函数的内容,而<accessor>块则对应getter与setter方法。

 

        再看回objectToString方法,从下面一段代码得知,将JSONEncoder将AS对象转换成字符串时,处理的方法是读取对象的XML描述中的<accessor>块里面的内容,因此如果AS对象没有定义getter和setter方法,对象的XML描述中就不存在<accessor>,因此转换得到的JSON格式的字符串就为{}了。

for each ( var v:XML in classInfo..*.( name() == "variable" || name() == "accessor" ) )

{

	// When the length is 0 we're adding the first item so

	// no comma is necessary

	if ( s.length > 0 ) {

		// We've already added an item, so add the comma separator

		s += ","

	}

					

	s += escapeString( v.@name.toString() ) + ":" 

			+ convertToString( o[ v.@name ] );

}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值