SpringBoot關於JSON交互問題

SpringBoot關於JSON交互問題javascript

1、Json交互的優點前端

1.JSON原本就是javascript裏的內容,客戶端能夠很容易對JSON數據解析.

2.數據格式簡單、易於讀寫、帶寬佔用小、不錯的可讀性、可表示各種複雜性的數據。

3.服務端也能直接使用JSON格式數據,簡化了代碼開發量,易於維護。

2、SpringBoot之Controller中的使用java

1.實際項目中,先後端分離成爲主流趨勢,後臺負責業務邏輯處理,前端負責數據展現。後臺接口返回數據通常使用json格式,也可能使用xml。使用json報文。瞭解下面註解。spring

@Controller :處理http請求。

@ResponseBody :返回的結果直接寫入 HTTP 響應正文,@Responsebody 後返回結果不會被解析爲跳轉路徑,        直接寫入HTTP 響應正文中。

@RestController :註解至關於@ResponseBody + @Controller合在一塊兒的做用。(Spring4以後新加的註解)。

@Controller
@RequestMapping("/user")
public class UsersController
{
    @GetMapping("/getUser")
    @ResponseBody 
    public User getUser()
    {
        User user=new User();
        user.setId(24);            
        user.setLoginName("Kobe");
        user.setRealName("Bryant");
        user.setPasswd("123456");
        return user;
    }
}



訪問url:http://localhost:9090/oms/user/getUser
返回結果:
    {
        "id": 24,
        "lastModifyUId": 0,
        "lastModifyTime": null,
        "lastLoginTime": null,
        "loginIP": null,
        "loginName": "Kobe",
        "nickName": null,
        "realName": "Bryant",
        "passwd": "123456",
        "phone": null,
        "email": null,
        "areaId": null,
        "areaName": null,
        "status": null,
        "onlineStatus": 0,
        "salt": null,
        "isPreinstall": 0,
        "roleIds": null,
        "roles": null,
        "userPermissions": null,
        "rememberMe": false
    }

3、SpringBoot的默認JSON解析器(Jackson)json

1.由上面例子可見並未作任何配置,返回值爲User對象,直接轉換爲JSON格式輸出。Spring-Boot對json作了默認實現,使用的是內置Jackson轉換器。後端

2.從上面返回結果能夠發現兩個問題,第1、許多爲null的字段也輸出。第2、有些字段不想返回給前端(好比說密碼)。app

1.在Bean類上添加註@JsonInclude(Include.NON_NULL)配置.

@JsonInclude(Include.NON_NULL)
public class User implements Serializable{

    private static final long serialVersionUID = 1L;
    private int id;
    private int lastModifyUId;
    private Date lastModifyTime;
    private String lastLoginTime; //登錄時間
    private String loginIP;  //登錄IP
    private String loginName;
    ......

其中枚舉類型屬性:

    1.Include.Include.ALWAYS : 默認

    2.Include.NON_DEFAULT : 默認值不序列化

    3.Include.NON_EMPTY : 屬性爲 空("") 或者爲 NULL 都不序列化

    4.Include.NON_NULL : 屬性爲NULL 不序列化

返回結果:
    {
        "id": 24,
        "lastModifyUId": 0,
        "loginName": "Kobe",
        "realName": "Bryant",
        "passwd": "123456",
        "onlineStatus": 0,
        "isPreinstall": 0,
        "rememberMe": false
    }

2.從返回結果看值爲null的字段沒有序列化,可是passwd仍是返回出來.能夠再Bean類的不須要序列化的字段上加@JsonIgnore註解.

返回結果:
    {
    "id": 24,
    "lastModifyUId": 0,
    "loginName": "Kobe",
    "realName": "Bryant",
    "onlineStatus": 0,
    "isPreinstall": 0,
    "rememberMe": false
}

4、SpringBoot自定義JSON解析器(fastjson)框架

1.通常開發中習慣使用阿里的fastjson解析工具,fastjson具備極快的性能.fastjson是一個java庫集合,能夠操做任何java對象,直接使用泛型.fastJson默認將null的字段去除。前後端分離

添加依賴(注意解決衝突)

<dependency> 
   <groupId>com.alibaba</groupId> 
   <artifactId>fastjson</artifactId> 
   <version>1.2.47</version> 
</dependency> 

配置fastjson有兩種方式

第一種:

    ① 啓動類繼承 WebMvcConfigurerAdapter 。

    ②覆蓋configureMessageConverters方法。

@SpringBootApplication  //申明讓spring boot自動給程序進行必要的配置
public class AppStart extends WebMvcConfigurerAdapter {

    public static void main(String[] args) {
        SpringApplication.run(AppStart.class, args);
    }

    /**
     * 替換框架json爲fastjson
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        super.configureMessageConverters(converters);
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.PrettyFormat, 
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullNumberAsZero, 
                SerializerFeature.WriteNullStringAsEmpty
            );
        // 處理中文亂碼問題
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastConverter.setSupportedMediaTypes(fastMediaTypes);
        fastConverter.setFastJsonConfig(fastJsonConfig);

        //處理字符串, 避免直接返回字符串的時候被添加了引號
        StringHttpMessageConverter smc = new StringHttpMessageConverter(Charset.forName("UTF-8"));
        converters.add(smc);

        converters.add(fastConverter);
    }
}

第二種:ide

@Bean注入第三方的json解析框架

@Bean//使用@Bean注入fastJsonHttpMessageConvert
public HttpMessageConverters fastJsonHttpMessageConverters(){
//1.須要定義一個Convert轉換消息的對象
FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter();
//2.添加fastjson的配置信息,好比是否要格式化返回的json數據
FastJsonConfig fastJsonConfig=new FastJsonConfig();
//SerializerFeature.WriteMapNullValue序列化null的字段
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//3.在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter=fastConverter;
return new HttpMessageConverters(converter);
}

實體類中不須要序列化的字段可添加註解@JSONField(serialize=false)。

若是須要序列化null的字段,也可進行配置。具體可查閱fastJson的配置。

相關文章
相關標籤/搜索