今天要写一个生成json的方法,目的是将VO对象中的所有公共属性和值转换成一个json对象,这个类中20多个属性,手动拼的话,是个体力活,并且有其它的对象也要转成json,还要手动拼,脑袋里最先想到的就是反射。
我们知道,在java中,通过反射可以得到一个类中的所有信息,属性、方法、接口、注解等等,那么在flex中是不是也是如此呢?
随后google之,锁定了describeType方法,这是一个flash.utils下的公共方法,通过它也可以达到java中类似的效果。
下表描述了由describeType()生成的 XML 对象的某些标签和属性(返回的所有类和接口名称均采用完全限定的格式):
| 标签 | 属性 | 说明 |
|---|---|---|
<type> | XML 对象的根标签。 | |
| name | ActionScript 对象的数据类型的名称。 | |
| base | ActionScript 对象的定义类的直接超类。如果 ActionScript 对象是类对象,则值为Class。 | |
| isDynamic | 如果 ActionScript 对象的定义类是动态的,则为true;否则为false。如果 ActionScript 对象是类对象,则值为true,因为 Class 类是动态的。 | |
| isFinal | 如果 ActionScript 对象的定义类是最终类,则为true;否则为false。 | |
| isStatic | 如果 ActionScript 对象是类对象或构造函数,则为true;否则为false。此属性之所以名为isStatic,原因是:如果此属性为true,则未嵌套在factory标记内的任何标签都是静态的。 | |
<extendsClass> | ActionScript 对象的定义类的每个超类都有一个单独的extendsClass标签。 | |
| type | ActionScript 对象的定义类扩展的超类的名称。 | |
<implementsInterface> | ActionScript 对象的定义类或其任何超类实现的每个接口都有一个单独的implementsInterface标签。 | |
| type | ActionScript 对象的定义类实现的接口的名称。 | |
<accessor> | 存取器是 getter 和 setter 函数定义的一个属性。 | |
| name | 存取器的名称。 | |
| access | 属性的访问权限。可能的值包括readonly、writeonly和readwrite。 | |
| type | 属性的数据类型。 | |
| declaredBy | 包含关联的 getter 或 setter 函数的类。 | |
<constant> | 常量是用const语句定义的一个属性。 | |
| name | 常量的名称。 | |
| type | 常量的数据类型。 | |
<method> | 方法是作为类定义的一部分声明的函数。 | |
| name | 方法的名称。 | |
| declaredBy | 包含方法定义的类。 | |
| returnType | 方法的返回值的数据类型。 | |
<parameter> | 方法定义的每个参数都有一个单独的parameter标签。此标签始终嵌套在<method>标签内。 | |
| index | 一个数字,对应于参数在方法的参数列表中出现的顺序。第一个参数的值为 1。 | |
| type | 参数的数据类型。 | |
| optional | 如果参数是可选参数,则为true;否则为false。 | |
<variable> | 变量是用var语句定义的一个属性。 | |
| name | 变量的名称。 | |
| type | 变量的数据类型。 | |
<factory> | 如果 ActionScript 对象是类对象或构造函数,则所有实例属性和方法均嵌套在此标签内。如果<type>标签的isStatic属性为true,则未嵌套在<factory>标签内的所有属性和方法都是静态的。只有在 ActionScript 对象是类对象或构造函数时,此标签才会出现。 |
针对我的需求,我使用第一种方式,获得它返回的variable标签,代码如下:
- /**生成传入对象属性和值对应的json对象,对象中绑定的属性获取不到,返回的json带{},对象为null,返回""*/
- publicstaticfunctiongetOneJsonObject(obj:Object):String
- {
- if(obj==null)
- {
- return"";
- }
- varjsonInfo:String="{";
- //反射出传入对象的属性
- varproperties:XMLList=describeType(obj).variable;
- foreach(varpropertyInfo:XMLinproperties)
- {
- varpropertyName:String=propertyInfo.@name;
- jsonInfo+="\""+propertyName+"\":\""+obj[propertyName]+"\",";
- }
- jsonInfo=jsonInfo.substring(0,jsonInfo.length-1);
- jsonInfo+="}"
- returnjsonInfo;
- }
经过实验,describeType不能获取[Bindable]的属性,这样就可以生成一个传入对象的json字符串了。如果想要得到类其它信息,就更variable标签即可,对这个方法的使用详见官方API。
本文介绍如何利用Flex中的describeType方法,通过反射技术获取对象的属性和方法,进而将其转换为JSON字符串。重点阐述了方法的两种使用方式及如何避免获取到无法生成JSON的Bindable属性。
2827

被折叠的 条评论
为什么被折叠?



