fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[QUESTION]实现ObjectWriter接口配合@JSONField(serializeUsing = xxx.class)未生效

Open moyu1106 opened this issue 1 year ago • 10 comments

请描述您的问题

询问有关本项目的使用和其他方面的相关问题。 [依赖]

    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2</artifactId>
        <version>2.0.43</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2-extension</artifactId>
        <version>2.0.43</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2-extension-spring5</artifactId>
        <version>2.0.43</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2-extension-spring6</artifactId>
        <version>2.0.43</version>
    </dependency>

[配置] fastJsonConfig.setWriterFeatures( //输出list 为 [] JSONWriter.Feature.WriteNullListAsEmpty, //json格式化 JSONWriter.Feature.PrettyFormat, //输出map中value为null的数据 JSONWriter.Feature.WriteMapNullValue, //输出boolean 为 false JSONWriter.Feature.WriteNullBooleanAsFalse, //输出list 为 [] JSONWriter.Feature.WriteNullListAsEmpty, //输出number 为 0 JSONWriter.Feature.WriteNullNumberAsZero, //输出字符串 为 "" JSONWriter.Feature.WriteNullStringAsEmpty, //对map进行排序 JSONWriter.Feature.MapSortField); [自定义序列化] @Override public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { System.out.println("自定义序列化规则======================="); Optional .ofNullable(object). filter(Integer.class::isInstance) .map(Integer.class::cast) .ifPresent(jsonWriter::writeInt32); } [问题] 项目中的全局配置Integer类型默认值为0,但是我的业务中对于特定的类需要的默认值为null,想通过实现ObjectWriter接口配合@JSONField(serializeUsing = xxx.class)达到目的却未能实现,是我使用的不对吗?

moyu1106 avatar Dec 28 '23 09:12 moyu1106

image 上图符合你的目的吗?

yanxutao89 avatar Dec 30 '23 02:12 yanxutao89

很感谢您的帮助,对不起,我没能很好地讲清楚我的需求! 我的业务中关于金额(假设字段为Integer),0和null都是有意义的,没有设置Integer的值那么它将为null,设置了0就是0,当从数据库查询一条数据是如果integer没有值则为null(也是期望的序列化的默认值);

//例子A:
Bean beanA =new Bean();
beanA.setInteage(0);
//sout:
{"integer":0}

//例子B:
Bean beanA =new Bean();
beanA.setInteage(null);
//sout:
{"integer":null}

用一句话来总结就是我只想某个类的序列化效果是注释掉fastJsonConfig中的JSONWriter.Feature.WriteNullNumberAsZero的样子,而现在的情况是全局配置的优先级貌似高于我自己的实现了!

moyu1106 avatar Dec 30 '23 14:12 moyu1106

image 这样貌似可以?

yanxutao89 avatar Dec 30 '23 14:12 yanxutao89

调用toJsonString的话是可以的,但是我在调用接口时会得到不一致的结果 Uploading 91a82eef63f22af0b3729c5e6380c8b.png…

moyu1106 avatar Dec 30 '23 15:12 moyu1106

可以提供简单的复现用例吗?

yanxutao89 avatar Jan 02 '24 10:01 yanxutao89

fastjson2-test.zip 我上传了一个压缩包,一个springboot项目,您可以通过TestController中的接口测试,非常感谢大佬的帮助!

moyu1106 avatar Jan 02 '24 15:01 moyu1106

请问这个问题该如何解决呢?是我的使用方式不对吗?

moyu1106 avatar Jan 07 '24 09:01 moyu1106

同样的问题

mdddj avatar Jan 10 '24 08:01 mdddj

和你遇到同样的问题, 该BUG已解决,请更新到最新版本。

zhouzhibing avatar Jan 30 '24 08:01 zhouzhibing

请问这个问题该如何解决呢?是我的使用方式不对吗?

1706865521466 直接换成这个就可以了,你试试吧

yanxutao89 avatar Feb 02 '24 09:02 yanxutao89