? ? ? ?今天要写一个生成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标签,代码如下:
- ??
- ????????public?static?function?getOneJsonObject(obj:Object):String??
- ????????{??
- ????????????if(obj?==?null)??
- ????????????{??
- ????????????????return?"";??
- ????????????}??
- var?jsonInfo:String?=?"{";??
- ??????????????
- var?properties:XMLList?=?describeType(obj).variable;??
- ????????????for?each(var?propertyInfo:XML?in?properties)??
- ????????????{??
- ????????????????var?propertyName:String?=?propertyInfo.@name;??
- ????????????????jsonInfo?+=?"""?+?propertyName?+?"":""?+?obj[propertyName]?+?"",";??
- ??????????????????
- ????????????}??
- ????????????jsonInfo?=?jsonInfo.substring(0,?jsonInfo.length?-?1);??
- ????????????jsonInfo?+=?"}"??
- return?jsonInfo;??
- ????????}??
? ? ? ?经过实验,describeType不能获取[Bindable]的属性,这样就可以生成一个传入对象的json字符串了。如果想要得到类其它信息,就更换variable标签即可,对这个方法的使用详见官方API。