当前位置:编程学习 > JAVA >>

Android的数据处理:使用annotation实现JSON字符串解析为java对象

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);  
 
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,