fastjson Fastjson与Spring MVC 整合后配置WriteMapNullValue怎么让一部分类序列化后不输出null

rsaldnfx  于 2021-11-27  发布在  Java
关注(0)|答案(10)|浏览(377)

在Spring mvc中配置为

<bean id="fastJsonConfig" class="com.alibaba.fastjson.support.config.FastJsonConfig">
    <!-- Default charset -->
    <property name="charset" value="UTF-8" />
    <!-- SerializerFeature -->
    <property name="serializerFeatures">
        <list>
            <value>QuoteFieldNames</value>
            <value>WriteMapNullValue</value>
        </list>
    </property>
</bean>
<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
         <!--将StringHttpMessageConverter的默认编码设为UTF-8-->
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <constructor-arg value="UTF-8"/>
        </bean>
        <!-- 配置Fastjson支持 -->
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>application/json</value>
                </list>
            </property>
            <property name="fastJsonConfig" ref="fastJsonConfig"/>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

这样配置后,Controller返回的对象属性值为空会输出{"name":null} ,怎么让一部分类序列化输出忽略null

使用jackson时默认输出null,但是在类上加上注解@JsonInclude(JsonInclude.Include.NON_NULL)就可以实现目的,但是在fastjson中没有找到相关配置。

cigdeys3

cigdeys31#

  1. 使用serialize/deserialize指定字段不序列化
sirbozc5

sirbozc52#

使用@JSONField(serialize=false)后不管该字段值是否为Null都不会被序列化,我的要求是当字段的值为Null时 不序列化,当不为Null时 需要序列化。

dkqlctbz

dkqlctbz3#

PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化
Class_Level_SerializeFilter

6jygbczu

6jygbczu4#

@CharkeyQK 使用你说的方法可以解决自己手动调用API序列化的情况,但是怎么与Spring MVC整合起来,让Sping MVC 知道我哪些类 序列化的时候要忽略Null值

oaxa6hgo

oaxa6hgo5#

com.alibaba.fastjson.support.config.FastJsonConfig#classSerializeFilters

Spring MVC 配置 fastJsonHttpMessageConverter 的时候,也配置一下 fastJsonConfig,其中 fastJsonConfig 可以配置 classSerializeFilters。

public class NullValuePropertyFilter implements PropertyFilter {

    @Override
    public boolean apply(Object object, String name, Object value) {
        return value != null;
    }
}
0ejtzxu1

0ejtzxu16#

@CharkeyQK 这样配置后应该会覆盖WriteMapNullValue属性,难道要在apply方法中判断是否是某个特定的类?这样显得不太灵活,后面新增了有这样需求的类,得再来修改apply方法,我希望能设计一个注解,该注解的优先级大于Sping MVC 中fastJsonConfig的配置,这样在我不希望序列化Null值的类上,我只需要注解一下就ok

hof1towb

hof1towb7#

用 PropertyFilter,apply 方法中获取 类上面的注解,然后做你需要的逻辑判断。

ulmd4ohb

ulmd4ohb8#

classSerializeFilters 是一个Map<Class<?>, SerializeFilter>,只能给具体的类加过滤器,如果想通过@CharkeyQK 说的注解的方式给所有的bean都加上PropertyFilter怎么做呢?

jtw3ybtb

jtw3ybtb10#

#2684 应该就可以解决你的问题,在下一版本中将会实现这一个功能。

相关问题