alibaba / fastjson2

🚄 FASTJSON2 is a Java JSON library with excellent performance.
Apache License 2.0
3.74k stars 484 forks source link

[QUESTION]如何在自定义序列化时实现某条件满足时忽略该字段的序列化 #2214

Open Heartbreaker16 opened 9 months ago

Heartbreaker16 commented 9 months ago

User.java

import com.alibaba.fastjson2.annotation.JSONField;

public class User  {
    /**
        其他字段...
    */
    @JSONField(serializeUsing = NotWriteEmptyString.class)
    private String career;
}

NotWriteEmptyString.java

import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.writer.ObjectWriter;
import java.lang.reflect.Type;

public class NotWriteEmptyString implements ObjectWriter<String> {
    @Override
    public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) {
        if ("".equals(object)) {
            jsonWriter.writeNull();
        }
    }
}

想要实现的效果是如果字符串属性的值为空字符串就不进行序列化返回给前端。 而按照上面的方式,前端收到的数据只是相应属性变成了null值。 请问我要怎么做?

相关依赖: jdk: 1.8 maven:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.9</version>
        <relativePath/>
    </parent>
    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2</artifactId>
        <version>2.0.43</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2-extension-spring5</artifactId>
        <version>2.0.43</version>
    </dependency>
yanxutao89 commented 9 months ago

image

上图是否符合您的需求?

Heartbreaker16 commented 9 months ago
import com.alibaba.fastjson2.filter.PropertyFilter;
import com.alibaba.fastjson2.support.config.FastJsonConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.alibaba.fastjson2.support.spring.http.converter.FastJsonHttpMessageConverter;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class FastJson2Config implements WebMvcConfigurer {
    /**
     * 配置fastjson输出格式
     **/
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        // 1. 获取fastjson json
        FastJsonConfig config = getFastJsonConfig();

        // 2. 添加fastjson转换器
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        List<MediaType> supportedMediaTypes = new ArrayList<>();

        // 3. 添加支持的媒体类型
        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
        supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
        supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        supportedMediaTypes.add(MediaType.APPLICATION_PDF);
        supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XML);
        supportedMediaTypes.add(MediaType.IMAGE_GIF);
        supportedMediaTypes.add(MediaType.IMAGE_JPEG);
        supportedMediaTypes.add(MediaType.IMAGE_PNG);
        supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
        supportedMediaTypes.add(MediaType.TEXT_HTML);
        supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
        supportedMediaTypes.add(MediaType.TEXT_PLAIN);
        supportedMediaTypes.add(MediaType.TEXT_XML);

        converter.setSupportedMediaTypes(supportedMediaTypes);

        //4 将convert添加到converters
        converter.setFastJsonConfig(config);
        converters.add(0, converter);
    }

    private static FastJsonConfig getFastJsonConfig() {
        FastJsonConfig config = new FastJsonConfig();

        config.setCharset(StandardCharsets.UTF_8);
        config.setReaderFeatures();

         // 尝试忽略null值的序列化
        PropertyFilter ignoreNull = (object, name, value) -> null != value;
        config.setWriterFilters(ignoreNull);

        return config;
    }
}

如您所说,我在springboot项目中fastjson2的全局配置里加了以下两行,但没有效果。

PropertyFilter ignoreNull = (object, name, value) -> null != value;
config.setWriterFilters(ignoreNull);

我之前的NotWriteEmptyString是配置在属性上的serializer,某些属性需要某些不需要。 我感觉是这个serializer中的jsonWriter.writeNull()方法覆盖了全局配置,因为fastjson2默认就是不会序列化null的属性的。 请问在一个springboot项目里面,需要怎么进行配置,能使得指定的字段应用NotWriteEmptyString? @yanxutao89

mek1986 commented 8 months ago
import com.alibaba.fastjson2.filter.PropertyFilter;
import com.alibaba.fastjson2.support.config.FastJsonConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.alibaba.fastjson2.support.spring.http.converter.FastJsonHttpMessageConverter;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class FastJson2Config implements WebMvcConfigurer {
    /**
     * 配置fastjson输出格式
     **/
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        // 1. 获取fastjson json
        FastJsonConfig config = getFastJsonConfig();

        // 2. 添加fastjson转换器
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        List<MediaType> supportedMediaTypes = new ArrayList<>();

        // 3. 添加支持的媒体类型
        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
        supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
        supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        supportedMediaTypes.add(MediaType.APPLICATION_PDF);
        supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XML);
        supportedMediaTypes.add(MediaType.IMAGE_GIF);
        supportedMediaTypes.add(MediaType.IMAGE_JPEG);
        supportedMediaTypes.add(MediaType.IMAGE_PNG);
        supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
        supportedMediaTypes.add(MediaType.TEXT_HTML);
        supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
        supportedMediaTypes.add(MediaType.TEXT_PLAIN);
        supportedMediaTypes.add(MediaType.TEXT_XML);

        converter.setSupportedMediaTypes(supportedMediaTypes);

        //4 将convert添加到converters
        converter.setFastJsonConfig(config);
        converters.add(0, converter);
    }

    private static FastJsonConfig getFastJsonConfig() {
        FastJsonConfig config = new FastJsonConfig();

        config.setCharset(StandardCharsets.UTF_8);
        config.setReaderFeatures();

         // 尝试忽略null值的序列化
        PropertyFilter ignoreNull = (object, name, value) -> null != value;
        config.setWriterFilters(ignoreNull);

        return config;
    }
}

如您所说,我在springboot项目中fastjson2的全局配置里加了以下两行,但没有效果。

PropertyFilter ignoreNull = (object, name, value) -> null != value;
config.setWriterFilters(ignoreNull);

我之前的NotWriteEmptyString是配置在属性上的serializer,某些属性需要某些不需要。 我感觉是这个serializer中的jsonWriter.writeNull()方法覆盖了全局配置,因为fastjson2默认就是不会序列化null的属性的。 请问在一个springboot项目里面,需要怎么进行配置,能使得指定的字段应用NotWriteEmptyString? @yanxutao89

是不是空串""没过滤?