Json-lib可以将Java对象转成json格式的字符串,也可以将Java对象转换成xml格式的文档,同样可以将json字符串转换成Java对象或是将xml字符串转换成Java对象。
1、 首先要去官方下载json-lib工具包(http://sourceforge.net/projects/json-lib/files/json-lib/json-lib-2.4/)
下面言归正传 开始介绍json-lib的使用:
在实际项目中,为了代码复用性,减少代码冗余,常常对某些方法进行封装,用到的时候直接调用,不必要每次都重写相同代码。
Json-lib 可以处理集合或者单个对象转换成json字符串,针对集合或者单个对象json-lib采用了不同的方法来分开处理:
1) 当参数为单个对象:
//将参数对象转化成JSONObject对象
JSONObject jsonObject = JSONObject.fromObject(pObject);
//通过JSONObject的toString()方法得到json字符串
String jsonString = jsonObject.toString();
2) 当参数为集合类型
//将参数对象转换成JSONArray对象
JSONArray jsonArray = JSONArray.fromObject(pObject);
//通过jsonArray的toString()方法得到json字符串
String jsonString = jsonArray.toString();
※json-lib在处理日期格式化的时候要注意,如果你要格式化输出日期,需要手动实现JsonValueProcessor接口,来对日期进行处理。JsonValueProcessor接口中声明了两个方法:processArrayValue(Object value, JsonConfig jsonConfig)和 processObjectValue(String key, Object value,JsonConfig jsonConfig)顾名思义,分别针对数组集合和单个对象进行处理。
下面是我的实现:
/**
实现JsonValueProcessor接口
*/
public class DateJsonValueProcessor implements JsonValueProcessor{
private String format = "yyyy-MM-dd HH:mm:ss" ;
public DateJsonValueProcessor(String format){
this.format = format;
}
/**
*
针对数组进行处理
*/
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
String[] obj = {};
if (value instanceof java.util.Date[]) {
SimpleDateFormat sf = new SimpleDateFormat(format);
java.util.Date[] dates = (java.util.Date[]) value;
obj = new String[dates.length];
for (int i = 0; i < dates.length; i++) {
obj[i] = sf.format(dates[i]);
}
}
if (value instanceof Timestamp[]) {
SimpleDateFormat sf = new SimpleDateFormat(format);
Timestamp[] dates = (Timestamp[]) value;
obj = new String[dates.length];
for (int i = 0; i < dates.length; i++) {
obj[i] = sf.format(dates[i]);
}
}
if (value instanceof java.sql.Date[]) {
SimpleDateFormat sf = new SimpleDateFormat(format);
java.sql.Date[] dates = (java.sql.Date[]) value;
obj = new String[dates.length];
for (int i = 0; i < dates.length; i++) {
obj[i] = sf.format(dates[i]);
}
}
return obj;
}
/**
* 格式化单一对象
*/
public Object processObjectValue(String key, Object value,
JsonConfig jsonConfig) {
//判断value是否为空
if(GSUtils.isEmpty(value)){
return "";
}
//判断value类型
if (value instanceof Timestamp) {
String str = new SimpleDateFormat(format).format((Timestamp) value);
return str;
} else if (value instanceof java.util.Date) {
String str = new SimpleDateFormat(format).format((java.util.Date) value);
return str;
} else if (value instanceof java.sql.Date) {
String str = new SimpleDateFormat(format).format((java.sql.Date) value);
return str;
}
return value.toString();
}
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
}
实现了JsonValueProcessor接口,还没有完,因为json-lib不知道啊,所以还要继续下去,现在我们需要用到JsonConfig类,通过使用这个类,可以将我们自定义的实现注册到json-lib上,关键代码如下:
JsonConfig cfg = new JsonConfig();
cfg.registerJsonValueProcessor(java.sql.Timestamp.class, new DateJsonValueProcessor(pFormatString));
cfg.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor(pFormatString));
cfg.registerJsonValueProcessor(java.sql.Date.class, new DateJsonValueProcessor(pFormatString));
到了这一步 我们终于要完成任务了,但是还是继续看吧,我们需要将jsonconfig对象传入fromObject中,注意cfg
1) 当参数为单个对象:
//将参数对象转化成JSONObject对象
JSONObject jsonObject = JSONObject.fromObject(pObject,cfg);
//通过JSONObject的toString()方法得到json字符串
String jsonString = jsonObject.toString();
2) 当参数为集合类型
//将参数对象转换成JSONArray对象
JSONArray jsonArray = JSONArray.fromObject(pObject,cfg);
//通过jsonArray的toString()方法得到json字符串
String jsonString = jsonArray.toString();
...
关于json-lib 功能还是非常强大的,这里只是工作涉及到这部分知识点,更多功能请参考API,这里简单介绍一些工作中常用的方法:
toBean(String jsonString, Class targetClass)---将json字符串转化为目标对象,需要注意的是目标类中必须有空的构造函数。
toString()---将java对象转换成json字符串
toArray() -- 从json字串中得到相应java数组
toArray() -- 将list转换成Array