[alibaba/fastjson]FastJsonHttpMessageConverter无法支持全局Date反序列化

2024-05-23 857 views
9

自定义了一个FastJsonSerializerParser.java来做序列化与反序列化的解析 为了方便说明, 我在反序列化deserialze方法中直接抛错.内容如下 image

注册springboot MessageConverters,如下: image

测试接口: image

执行 curl -X POST -d '{"date1":"2019-01-01T09:25:01"}' http://localhost/post-json 竟然没报错?说明没走到deserialze方法里.

断点调试了下, fastjson的注册应该没问题, 因为有走到write序列化的方法里

但是如果我给date1加上注解: image

这个时候就能走到deserialze方法.

这就不太明白了?fastjson不允许自己定义Date.class的反序列化吗?

但是我单独测试fastjson(没有结合springboot),如下: image 是可以成功的

说明是FastJsonHttpMessageConverter的问题吗?

回答

4

测试版本1.2.29 反序列化仍然走的是DateCodec.class里面的方法,但是序列化就走的是我自己FastJsonSerializerParser里面的方法,这很奇怪啊

8

应该是找到问题了,这里 image FastJsonHttpMessageConverter在做反序列化的时候,只传入了fastJsonConfig.getCharset()fastJsonConfig.getFeatures(),然后调用静态方法JSON.parseObject做解析

这个时候fastJsonConfig的其他信息(如parserConfig)就丢失了,亦即如下代码没有任何作用 image

0

有一个简单的修复方法,就是继承FastJsonHttpMessageConverter, 然后重写read方法, 调用JSON.parserObejct的时候把parserConfig传入 image 只是这个时候xuy需要把inputStream的数据全部读取出来,这个可能不太友好?

4

有点好奇当初为什么没有传入ParserConfig? 是否传入了会有隐患?

1

试了下1.2.68版本,虽然这个版本有传入ParserConfig,但是仍然没有办法走到自定义的反序列化方法中 image

2

这次1.2.68还是有问题啊,本来下面的代码1.2.29可以成功的。但是改成1.2.68就不行了。

`public class Test {

public static class JsonObject {
    private Date date;
    public Date getDate() {return date;}

    public void setDate(Date date) {this.date = date;}
}
public static class MyDateDeserializer implements ObjectDeserializer {
    private MyDateDeserializer() {}
    public static MyDateDeserializer INSTANCE = new MyDateDeserializer();
    @Override
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        throw new UnsupportedOperationException();
    }
    @Override
    public int getFastMatchToken() {
        return 0;
    }
}
public static void main(String[] main) throws Exception {
    ParserConfig parserConfig = new ParserConfig();
    parserConfig.putDeserializer(Date.class, MyDateDeserializer.INSTANCE);
    try {
        JSON.parseObject("{\"date\":\"2020-01-01\"}", JsonObject.class, parserConfig);
    }catch (Exception e) {
        System.out.println("success");
        return;
    }
    throw new RuntimeException("should not reach here");
}

}`

但是1.2.28的HttpMessageConverter又有问题,我晕了。。。。。