Fastjson: Java8LocalDateTime升级版本后序列化异常

Created on 28 Jul 2020  ·  1Comment  ·  Source: alibaba/fastjson

public static final Jdk8DateCodec      instance            = new Jdk8DateCodec();
private DateFormat                               dateFormat;
private String                                   dateFormatPattern;

SerializeConfig增加序列化配置时,直接调用instance,配置根本没有传递进去
image

Jdk8DateCodec初始化时直接调用无参构造,导致下方两个构建日期格式的属性没有被设置,请问怎么设置才能在Jdk8DateCodec实例化时增加日期格式?
FastJsonConverter调用了FastJsonView的renderMergedOutputModel方法,里面调用了JSON的静态方法
image
但是JSON静态类里面创建serializer时只设置了setFastJsonConfigDateFormatPattern,但是Jdk8DateCodec是使用的dateFormat,知道Java8的time包比较复杂,但是这种不通用的设置实在是比较烦心
image

Most helpful comment

没办法,没人处理,我先提供自己的实现,紧急处理一下
第一步:先自定义一个Jdk8DateCodec,集成CustomizeJdk8DateCodec,重写write方法就行了,只需要一点点修改
serializer.setDateFormat("yyyy-MM-dd HH:mm:ss");

public class CustomizeJdk8DateCodec extends Jdk8DateCodec {

    public static final CustomizeJdk8DateCodec instance = new CustomizeJdk8DateCodec();

    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        serializer.setDateFormat("yyyy-MM-dd HH:mm:ss");
        super.write(serializer, object, fieldName, fieldType, features);
    }
}

第二部
配置FastJsonHttpMessageConverter *时,覆盖SerializeConfig*关于Java8时间处理的处理器

 public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
            SerializerFeature.WriteMapNullValue,
            SerializerFeature.WriteNullListAsEmpty,
            SerializerFeature.DisableCircularReferenceDetect,
            SerializerFeature.PrettyFormat);
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        SerializeConfig serializeConfig = fastJsonConfig.getSerializeConfig();
        try {
            serializeConfig.put(Class.forName("java.time.LocalDateTime"), CustomizeJdk8DateCodec.instance);
            serializeConfig.put(Class.forName("java.time.LocalDate"),CustomizeJdk8DateCodec.instance);
        } catch (Exception e) {
            logger.error("非Java8以上版本!");
        }
        fastConverter.setFastJsonConfig(fastJsonConfig);
        return fastConverter;
    }

第三步:测试,通过....

>All comments

没办法,没人处理,我先提供自己的实现,紧急处理一下
第一步:先自定义一个Jdk8DateCodec,集成CustomizeJdk8DateCodec,重写write方法就行了,只需要一点点修改
serializer.setDateFormat("yyyy-MM-dd HH:mm:ss");

public class CustomizeJdk8DateCodec extends Jdk8DateCodec {

    public static final CustomizeJdk8DateCodec instance = new CustomizeJdk8DateCodec();

    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        serializer.setDateFormat("yyyy-MM-dd HH:mm:ss");
        super.write(serializer, object, fieldName, fieldType, features);
    }
}

第二部
配置FastJsonHttpMessageConverter *时,覆盖SerializeConfig*关于Java8时间处理的处理器

 public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
            SerializerFeature.WriteMapNullValue,
            SerializerFeature.WriteNullListAsEmpty,
            SerializerFeature.DisableCircularReferenceDetect,
            SerializerFeature.PrettyFormat);
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        SerializeConfig serializeConfig = fastJsonConfig.getSerializeConfig();
        try {
            serializeConfig.put(Class.forName("java.time.LocalDateTime"), CustomizeJdk8DateCodec.instance);
            serializeConfig.put(Class.forName("java.time.LocalDate"),CustomizeJdk8DateCodec.instance);
        } catch (Exception e) {
            logger.error("非Java8以上版本!");
        }
        fastConverter.setFastJsonConfig(fastJsonConfig);
        return fastConverter;
    }

第三步:测试,通过....

Was this page helpful?
0 / 5 - 0 ratings