介绍
介绍
福哥在使用JSONObject实现从json数据到bean实体的转换和从bean实体到json数据的转换是时候,发现遇到Date或者Timestamp类型的实体属性会报错
net.sf.ezmorph.MorphDynBean
检查发现是在json数据转bean实体的时候bean实体包含Timestamp类型的属性就会报这个错误,追踪发现原来是在bean实体转json数据的时候bean实体的Timestamp类型的属性就没有正确转为json数据的字符串
解决方法
原来的转换方法
原来的转换方法很简单,直截了当的进行硬转换
json转bean
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; }
bean转json
public String beanToJson(Object value) { JSONObject jsonObject = JSONObject.fromObject(value); return jsonObject.toString(); }
改造的转换方法
因为Date和Timestamp是非字符串类型(其实其他类型也一样)不能直接映射,需要自己编写转换函数,所以福哥就准备了两个对象用来实现json到bean的数据转换逻辑和bean到json的数据转换逻辑
json转bean处理器
这个对象用来在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); } }
json转bean
通过 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处理器
这个对象用来在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); } }
bean转json
通过 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也可以处理