fastjson2
fastjson2 copied to clipboard
[QUESTION]如何在自定义序列化时实现某条件满足时忽略该字段的序列化
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>
上图是否符合您的需求?
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
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
是不是空串""没过滤?