今天要寫一個生成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,返回"" */
02. public static function getOneJsonObject(obj:Object):String
03. {
04. if(obj == null)
05. {
06. return "";
07. }
08. var jsonInfo:String = "{";
09. // 反射出傳入對象的屬性
10. var properties:XMLList = describeType(obj).variable;
11. for each(var propertyInfo:XML in properties)
12. {
13. var propertyName:String = propertyInfo.@name;
14. jsonInfo += "\"" + propertyName + "\":\"" + obj[propertyName] + "\",";
15.
16. }
17. jsonInfo = jsonInfo.substring(0, jsonInfo.length - 1);
18. jsonInfo += "}"
19. return jsonInfo;
20. }
經過實驗,describeType不能獲取[Bindable]的屬性,這樣就可以生成一個傳入對象的json字符串了。如果想要得到類其它信息,就更換variable標簽即可,對這個方法的使用詳見官方API。