在Springboot中默认的JSON解析框架是jackson
今天引入alibaba的fastjson,使用@JSONField(serialize=false),让@RestController转换数据给前端的时候不序列化莫些字段,发现@JSONField根本不起作用
在网上查阅了一番,发现Springboot使用fastjson需要替换默认的json转换器的
具体解决方法有两种:
本文借鉴地址:https://blog.csdn.net/qq_28929589/article/details/79245774
一、(1)启动类继承extends WebMvcConfigurerAdapter (2)覆盖方法configureMessageConverters
二、(1)在App.java启动类中,注入Bean : HttpMessageConverters
第一种方式:
启动类继承WebMvcConfigurerAdapter,然后对configureMessageConverters方法进行重写
@Override public void configureMessageConverters(List> converters) { super.configureMessageConverters(converters); FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat ); fastConverter.setFastJsonConfig(fastJsonConfig); converters.add(fastConverter); }
第二种方式:在App.java启动类中,注入Bean : HttpMessageConverters
@Bean public HttpMessageConverters fastJsonHttpMessageConverters() { FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); fastConverter.setFastJsonConfig(fastJsonConfig); HttpMessageConverter converter = fastConverter; return new HttpMessageConverters(converter); }
那么这时候在实体类中使用@JSONField(serialize=false),是不是此字段就不返回了,如果是的话,那么恭喜你配置成功了,其中JSONField的包路径是:com.alibaba.fastjson.annotation.JSONField。
使用fastjson进行序列化,就是把JavaBean转换为JSON格式的数据。而且fastjson的序列化高度可控性,可以自己定制序列化。fastjson的定制序列化有很多中实现方式,主要有如下的方式:
- 通过@JSONField定制序列化
- 通过@JSONType定制序列化
- 通过SerializeFilter定制序列化
1、在实体类上的字段使用@JSONField定制序列化:
//配置序列化的时候,不序列化id
@JSONField(serialize=false)
private int id;
// 配置序列化的名称
@JSONField(name="gender")
public String sex;
2、在类上通过@JSONType定制序列化:
//配置序列化的时候,不序列化id sex
@JSONType(ignores ={"id", "sex"})
// 配置序列化的时候,序列化name 和sex
@JSONType(includes={"name","sex"})
注:注意和@JSONField不同的是,@JSONType是配置在类上的,而@JSONField是配置在字段和方法上的。
3、使用SerializeFilter定制序列化:
通过SerializeFilter可以使用扩展编程的方式实现定制序列化。fastjson提供了多种SerializeFilter:
PropertyPreFilter: 根据PropertyName判断是否序列化;
PropertyFilter: 根据PropertyName和PropertyValue来判断是否序列化;NameFilter: 修改Key,如果需要修改Key,process返回值则可;ValueFilter: 修改Value;BeforeFilter: 序列化时在最前添加内容;AfterFilter: 序列化时在最后添加内容
https://www.cnblogs.com/h-java/p/10220737.html