使用JSONObject实现json数据和bean实体互转的Date和Timestamp类型的问题

发表于 2020-09-02
阅读 87

介绍

介绍

福哥在使用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也可以处理

鬼谷子叔叔

跟福哥学编程吧~~
日志
212
浏览
1626