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);