模型转json对象,在实际编码中的运用应该是很频繁的。
常用的包有Gson、net.sf.json等。
在使用net.sf.json的fromObject()方法时,Date日期格式的属性总会被转成year-mouth-day等可读性很差的格式,而我们想要的格式一般应该是:“yyyy-MM-dd HH:mm:ss”或者long类型,那么应该怎么处理呢?
利用JsonObject和JsonArray的重载方法:
public static JSONArray fromObject(Object object, JsonConfig jsonConfig)
利用这个方法,我们就能指定某类型的数据按照我们想要的格式去处理。
以日期格式为例:
新建一个类MyJsonConfig,继承自JsonConfig类,在类的构造方法中,调用
public void registerJsonValueProcessor(Class propertyType, JsonValueProcessor jsonValueProcessor)
方法来注册一个类型处理器,我们把Date类型处理器的名称定为:
class JsonDateValueProcessor implements JsonValueProcessor
然后我们实现JsonValueProcessor接口的方法:
@Override
public Object processArrayValue(Object o, JsonConfig jsonConfig) {
return this.process(o);
}
@Override
public Object processObjectValue(String s, Object o, JsonConfig jsonConfig) {
return this.process(o);
}
private Object process(Object value) {
if (value instanceof Date) {
if (type.equals(Long.class)) {
return ((Date)value).getTime();
} else if (type.equals(String.class)) {
SimpleDateFormat sdf = new SimpleDateFormat(this.dateFormat);
return sdf.format(value);
}
}
return value == null ? "" : value.toString();
}
综上,一个完整的MyJsonConfig类的实现如下:
package cn.xxx.tech.utils.JSON;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyJsonConfig extends JsonConfig {
class JsonDateValueProcessor implements JsonValueProcessor {
private final String dateFormat ="yyyy-MM-dd HH:mm:ss";
private Class type;
public JsonDateValueProcessor (Class type) {
this.type = type;
}
public JsonDateValueProcessor() {
this.type = String.class;
}
@Override
public Object processArrayValue(Object o, JsonConfig jsonConfig) {
return this.process(o);
}
@Override
public Object processObjectValue(String s, Object o, JsonConfig jsonConfig) {
return this.process(o);
}
private Object process(Object value) {
if (value instanceof Date) {
if (type.equals(Long.class)) {
return ((Date)value).getTime();
} else if (type.equals(String.class)) {
SimpleDateFormat sdf = new SimpleDateFormat(this.dateFormat);
return sdf.format(value);
}
}
return value == null ? "" : value.toString();
}
}
public MyJsonConfig(Class type) {
super();
this.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor(type));
}
public MyJsonConfig() {
super();
this.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor(String.class));
}
}
使用方法:
JSONArray dataJsonArray = JSONArray.fromObject(resultList, new MyJsonConfig());