Annotation是Java語言所提供的一種很有用的機制,特別在用於Java對象的描述化處理時能大大簡化代碼量。在閱讀本文之前最好先瞭解一下Java Annotation的基礎知識,在這一方面在網上很容易找到學習資料,比如下面這一篇: JAVA ANNOTATION詳解JSON與Java對象之間的形式化轉換在一些J2EE的架構中有提供,但是在Android中沒有實現。本文主要介紹如何通過annotation實現一種形式化的方法,在Android上實現JSON字串與Java對象之間的相互轉化。 首先定義一個用於annotaion類型,在定義Java類時,可以使用該類型來標記哪些域(Field)需要輸出到JSON字串中。 [java] @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface JSONValue { String tag() default ""; } 該annotation包括一個變數tag,這是指其所標記的域在JSON字串中的前置字串(名稱)。然後定義一個轉換工具類,用於Java對象與JSON對象之間的轉換。 [java] public class JSONConverter { public static void fromJSon(String json_string, Object o) throws Exception { JSONObject = new JSONObject(json_string); JSONObject jo = new JSONObject(); Field[] fields = o.getClass().getFields(); for(Field f : fields) { if(f.isAnnotationPresent(QueryValue.class)) { JSONValue jv = f.getAnnotation(JSONValue.class); String tag = jv.tag();if(tag.length() > 0) { if(f.getType().getSimpleName().equals("int")) { f.setInt(o, jo.optInt(tag)); } else { f.set(o, jo.optString(tag)); } } } } return jo.toString(); } public static String toJSon(Object o) throws Exception { JSONObject = new JSONObject(); Field[] fields = o.getClass().getFields(); for(Field f : fields) { if(f.isAnnotationPresent(QueryValue.class)) { JSONValue jv = f.getAnnotation(JSONValue.class); String tag = jv.tag(); if(tag.length() > 0) { if(f.getType().getSimpleName().equals("int")) { jo.put(tag, f.getInt(o)); } else { Object v = f.get(o); if(v != null) jo.put(tag, v); } } } } return jo.toString(); } } 上述工具類實現了兩個靜態方法:fromJSON()用於從JSON對象中解析出Java對象,toJSON()用於將一個Java對象轉換為JSON對象。在上述樣本中僅支援int、String兩種資料類型,這已經能滿足絕大多數應用的需要。如果還想支援其它類型,則需要根據樣本進行修改。另外,上述樣本尚不支援JSON數群組類型。 然後是定義需要轉為為JSON對象的Java類型,定義時需要使用前面定義的annotation,比如:[java] class MyObject { @JSONValue(tag="id") public int mId; @JSONValue(tag="name") public String mName; } 在定義需要輸出到JSON對象的域時,將該域定義為public類型,並使用JSONValue進行標記,同時指定該域在JSON對象中的前置字串(名稱)。在使用時可以很簡單地將該類型的對象轉為JSON字串:[java] MyObject o = new MyObject(); o.mId = 123; o.mName = "張三"; String json = JSONConverter.toJSON(o); 轉換後的JSON字串型為:{"id":123,"name":"張三”};JSON字串也可以很容易解析成Java對象:[java] String json_string = {"id":123,"name":"張三”}; MyObject o = new MyObject(); JSONConverter.fromJSON(json_string, o);