福哥在使用JSONObject实现从json数据到bean实体的转换和从bean实体到json数据的转换是时候,发现遇到Date或者Timestamp类型的实体属性会报错
net.sf.ezmorph.MorphDynBean
检查发现是在json数据转bean实体的时候bean实体包含Timestamp类型的属性就会报这个错误,追踪发现原来是在bean实体转json数据的时候bean实体的Timestamp类型的属性就没有正确转为json数据的字符串
原来的转换方法很简单,直截了当的进行硬转换
public Object jsonToBean(String jsonString, Class<?> cls) {
JSONObject jsonObject = JSONObject.fromObject(jsonString);
try {
return JSONObject.toBean(jsonObject, cls);
}
catch (Exception e){
e.printStackTrace();
}
return null;
}public String beanToJson(Object value) {
JSONObject jsonObject = JSONObject.fromObject(value);
return jsonObject.toString();
}因为Date和Timestamp是非字符串类型(其实其他类型也一样)不能直接映射,需要自己编写转换函数,所以福哥就准备了两个对象用来实现json到bean的数据转换逻辑和bean到json的数据转换逻辑
这个对象用来在json转bean的时候“尝试”解析json数据的属性“可能”是Date或者Timestamp类型就进行类型转换操作,Date类型一个对象,Timestamp一个对象
class DateBeanToJsonProcessor implements JsonValueProcessor {
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return process(value);
}
public Object processObjectValue(String key, Object value,JsonConfig jsonConfig) {
return process(value);
}
private Object process(Object value){
return TFCalendar.toString((Date) value);
}
}
class TimestampBeanToJsonProcessor implements JsonValueProcessor {
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
return process(value);
}
public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
return process(value);
}
private Object process(Object value){
return TFCalendar.toString((Timestamp) value);
}
}通过 JSONUtils.getMorpherRegistry().registerMorpher 来添加转换处理器,Date和Timestamp都要添加(如果有其他类型也要加进来)
public Object jsonToBean(String jsonString, Class<?> cls) {
JSONUtils.getMorpherRegistry().registerMorpher(new DateJsonToBeanMorpher());
JSONUtils.getMorpherRegistry().registerMorpher(new TimestampJsonToBeanMorpher());
JSONObject jsonObject = JSONObject.fromObject(jsonString);
try {
return JSONObject.toBean(jsonObject, cls);
}
catch (Exception e){
e.printStackTrace();
}
return null;
}这个对象用来在bean转json的时候将Date或者Timestamp类型转为字符串
class DateJsonToBeanMorpher extends AbstractObjectMorpher {
@Override
public Object morph(Object value) {
if(value == null){
return null;
}
Date date = TFCalendar.toDate((String) value);
if(date != null){
return date;
}
return value;
}
@Override
public Class morphsTo() {
return Date.class;
}
public boolean supports(Class clazz) {
return String.class.isAssignableFrom(clazz);
}
}
class TimestampJsonToBeanMorpher extends AbstractObjectMorpher {
@Override
public Object morph(Object value) {
if(value == null){
return null;
}
Timestamp timestamp = TFCalendar.toTimestamp((String) value);
if(timestamp != null){
return timestamp;
}
return value;
}
@Override
public Class morphsTo() {
return Timestamp.class;
}
public boolean supports(Class clazz) {
return String.class.isAssignableFrom(clazz);
}
}通过 JsonConfig.registerJsonValueProcessor 来添加转换处理器,Date和Timestamp都要添加(如果有其他类型也要加进来)
public String beanToJson(Object value) {
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class, new DateBeanToJsonProcessor());
jsonConfig.registerJsonValueProcessor(Timestamp.class, new TimestampBeanToJsonProcessor());
JSONObject jsonObject = JSONObject.fromObject(value, jsonConfig);
return jsonObject.toString();
}其实就是通过 JsonConfig.registerJsonValueProcessor 添加 bean实体到json数据的转换器,一个类型一个转换器,不仅可以处理Date和Timestamp也可以处理
然后通过 JSONUtils.getMorpherRegistry().registerMorpher 添加 json数据到bean实体的转换器,一个类型一个转换器,不仅可以处理Date和Timestamp也可以处理