项目A中需要将对象Case转换成json字符串,然后发送字符串消息,项目B需要将收到的json消息,转换成Case对象,再进行操作。遇到了该Case对象中有多个Date类型的字段,我又不想麻烦的将所有Date转成String类型,再生成JSON,最后鼓捣了一下午,在网上找到了解决方法。
使用net.sf.json.JSONObject进行转换(2019-04-12发现net.sf.json.JSONObject没有com.alibaba.fastjson好用,参考net.sf.json和com.alibaba.fastjson对比),pom.xml文件中引入依赖的jar包:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
将含有Date类型的对象转成json字符串,代码如下
1.java对象(含Date类型字段)转JSON
需要使用JSONConfig对象,对传入的数据,进行处理:
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
JSONObject jsonObject = JSONObject.fromObject(case1,jsonConfig);
JsonDateValueProcessor实现了JsonValueProcessor接口:
import java.text.SimpleDateFormat;
import java.util.Date;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
public class JsonDateValueProcessor implements JsonValueProcessor{
private String datePattern = "yyyy-MM-dd HH:mm:ss";//默认样式,可以在构造方法中修改
public JsonDateValueProcessor() {
super();
}
public JsonDateValueProcessor(String datePattern) {
super();
this.datePattern = datePattern;
}
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
try {
if(value instanceof Date){
SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
Date date = (Date)value;
return sdf.format(date);
}
return value == null ? null : value.toString();
} catch (Exception e) {
return null;
}
}
public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
return processArrayValue(value, jsonConfig);
}
public String getDatePattern() {
return datePattern;
}
public void setDatePattern(String datePattern) {
this.datePattern = datePattern;
}
}
将main方法按照上述修改:
public static void main(String[] args) {
Case case1 = new Case();
case1.setCaseName("案件");
case1.setCreateDate(new Date());
case1.setAppDate(new Date());
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(case1,jsonConfig);
String json = jsonObject.toString();
System.out.println(json);
}