概述
如今大量的 Web 站点应用了 AJAX 技术,通过更少的数据通讯,服务器能够 更快的反馈用户请求,再通过 Javascript 的控制,让使用者有了更好的用户体 验。JSON 是一种轻量级的数据交换语言,它是 Javascript 的一个子集,又有 良好的可读性,经常用于客户端和服务器间的数据交换。因此,在服务器端,常 常需要将实体对象(JavaBean)转换为 JSON 格式数据。本文介绍了如何使用 Json-lib 转换 JavaBean 为 JSON 格式数据,并给出解决方法,以及利用 annotation 来增强 Json-lib 的两个功能:一是灵活的筛选 JavaBean 属性; 二是通过 JsonValueProcessor 来自定义如何转换 JavaBean 属性到 JSON 数据 。
JSON 数据格式
JSON 的数据格式简单易读,它存在于两种基本形式:
名值对(Collection):名称与值用‘:’分开;名值对之间用‘,’分隔 ;整体用‘ {} '括起来。例如 {name1:value1, name2:value2}
值的有序队列(Array):即数组,每个值之间用‘,’分隔;整体用‘ [] '括起来。例如:[value1, value2]
这两种形式的有机组合,就形成了 JSON 数据。
使用 Json-lib 转换 JavaBean 为 JSON 数据
Json-lib 是一个 java 工具库,它提供 api 来转换 JavaBean,Map, Collection 等对象为 JSON 数据,或反过来通过 JSON 数据得到 JavaBean。
Json-lib 的使用很容易,只要使用 JSONSerializer 的 toJSON 方法就可以 转换任意的 Java Object 为 JSON 对象了,再调用 JSON 对象的 toString 方 法可以得到转换后的字符串。不过还有一些进一步的问题需要我们自己来解决。
清单 1. 使用 JSONSerializer
import net.sf.json.JSONSerializer;
List list = new ArrayList();
list.add( "first" );
list.add( "second" );
JSON json = JSONSerializer.toJSON( list );
System.out.println( json.toString() );
// prints ["first","second"]
class MyBean{
private String name = "json";
private int pojoId = 1;
// getters & setters
...
}
json = JSONSerializer.toJSON( new MyBean() );
System.out.println( json.toString() );
// prints {"name":"json","pojoId":1}
问题 1: 需要有选择的提取 JavaBean 中的属性
清单 1 中的例子转换后的 JSON 数据中包含了 JavaBean 中的全部属性,可 是我们常常需要有选择的提取 JavaBean 中的特定属性出来。例如:
需要过滤掉循环引用的属性,这一点 json-lib 提供了 CycleDetectionStrategy 来处理,但是直接过滤掉更简单;
不同的情况下只需要 JavaBean 中的部分属性:比如列表界面只需要显示 Bean 的几个重要属性,而详情界面则需要显示更多的 Bean 的属性;
不同的用户权限限制用户只能获得某些属性数据;