Annotation是Java语言所提供的一种很有用的机制,特别在用于Java对象的描述化处理时能大大简化代码量。在阅读本文之前最好先了解一下Java Annotation的基础知识,在这一方面在网上很容易找到学习资料,比如下面这一篇:

JAVA ANNOTATION详解

JSON与Java对象之间的形式化转换在一些J2EE的框架中有提供,但是在Android中没有实现。本文主要介绍如何通过annotation实现一种形式化的方法,在Android上实现JSON字符串与Java对象之间的相互转化。

首先定义一个用于annotaion类型,在定义Java类时,可以使用该类型来标记哪些域(Field)需要输出到JSON字符串中。


@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME) public @interface JSONValue {String tag() default "";}

该annotation包括一个变量tag,这是指其所标记的域在JSON字符串中的前导字符串(名称)。

然后定义一个转换工具类,用于Java对象与JSON对象之间的转换。

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,比如:

class MyObject {@JSONValue(tag="id")public int mId;@JSONValue(tag="name")public String mName;}

在定义需要输出到JSON对象的域时,将该域定义为public类型,并使用JSONValue进行标记,同时指定该域在JSON对象中的前导字符串(名称)。在使用时可以很简单地将该类型的对象转为JSON字符串:

MyObject o = new MyObject();o.mId = 123;o.mName = "张三";String json = JSONConverter.toJSON(o);

转换后的JSON字符串型为:{"id":123,"name":"张三”};

JSON字符串也可以很容易解析成Java对象:

String json_string =  {"id":123,"name":"张三”};MyObject o = new MyObject();JSONConverter.fromJSON(json_string, o);



通过上述方法,MyObject的子类同样可以与JSON对象进行双向转换,子类中也可以定义自己的JSONValue。





更多相关文章

  1. Android下添加新的自定义键值和按键处理流程
  2. Android中自定义控件
  3. android 自定义progressbar进度条颜色
  4. android switch 控件自定义样式不显示??
  5. Android中的Context对象
  6. android 自定义checkbox
  7. android 自定义线程池ThreadPoolUtils工具类
  8. Android(Java):自定义控件
  9. Android 自定义ViewPager 实现轮播图

随机推荐

  1. [Android算法] Android蓝牙开发浅谈
  2. Alibaba无线搜索事业部-产品经理(移动端产
  3. 深度探索Android应用程序的基本原理
  4. Android(安卓)手机十大必备软件
  5. android运行C程序以及C程序在android下的
  6. 深入探索Android卡顿优化(下)
  7. 如何检索Android设备的唯一ID
  8. Android(安卓)开发者从0到1发布一个微信
  9. 搭建自己的android 开发环境 (eclipse +
  10. Android(安卓)IPC机制(三)在Android(安卓)S