Springboot使用alibaba的fastJson,@JSONField不起作用的問題


在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<HttpMessageConverter<?>> 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使用@JSONField、@JSONType、SerializeFilter定制序列化

使用fastjson進行序列化,就是把JavaBean轉換為JSON格式的數據。而且fastjson的序列化高度可控性,可以自己定制序列化。fastjson的定制序列化有很多中實現方式,主要有如下的方式:

  1. 通過@JSONField定制序列化
  2. 通過@JSONType定制序列化
  3. 通過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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM