SpringBoot基礎實戰系列(二)springboot解析json與HttpMessageConverter

上古神龍發表於2020-05-14

SpringBoot解析Json格式資料

@ResponseBody

注:該註解表示前端請求後端controller,後端響應請求返回 json 格式資料前端,實質就是將java物件序列化

1.建立Controller

注:springboot預設就已經支援返回json格式資料,只需要加上@ResponseBody註解即可

    /**
     * 通過 @responsebody 註解返回 json 格式資料
     * @return
     */
    @RequestMapping("/getAll")
    @ResponseBody
    public List<User> getUsers(){
        ArrayList<User> users = new ArrayList<>();
        for(int i=0; i < 10 ; i++){
            User user = new User();
            user.setId(String.valueOf(i));
            user.setUsername("shanggushenlong>>>"+i);
            user.setAge(i);
            user.setBirthday(new Date());
            users.add(user);
        }
        return users;
    }

2.建立bean

public class User {
    private String id;
    private String username;
    private Integer age;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", username='" + username + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                '}';
    }

3.結果

在這裡插入圖片描述

@RequestBody

注:該註解表示前端發起請求時,要求請求體為 json 格式資料,實質就是反序列化到對應的物件中

1.建立controller

   /**
     * 前端傳入json資料,後端以String字串接收
     * @param userStr
     * @return
     */
    @RequestMapping("/setUser")
    @ResponseBody
    public String getUser(@RequestBody String userStr){
        System.out.println(userStr);
        return userStr.toString();
    }

    /**
     * 前端傳入json,後端用 user 物件接收,@RequestBody 能夠自動將前端傳入的json與bean
     * 自動序列化對應成功一個例項物件
     * @param user
     * @return
     */
    @RequestMapping("/setUser2")
    @ResponseBody
    public String getUser2(@RequestBody User user){
        System.out.println(user);
        return user.toString();
    }

2.結果

  • 使用postman發起請求,需要在body中新增相應的請求體
  • 可能出現的問題:時間格式轉換報錯 ------ 解決方法,在 bean 實體類中對應的 birthday 欄位新增註解@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    在這裡插入圖片描述
    在這裡插入圖片描述

HttpMessageConverter

springboot對於json預設支援的比較好,但是有時候需要自定義配置,比如上面的時間格式配置,假如你的專案有很多個bean,這個時候每一個bean去新增註解比較麻煩,這個時候就可以使用springboot提供的配置類,自己手動定義配置。

@Configuration
public class WebMvcConfig {

    @Bean
    MappingJackson2HttpMessageConverter MyHttpMessageConverter(){
        // 1.建立一個 Convert
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        // 2. 建立objectmapper
        ObjectMapper objectMapper = new ObjectMapper();
        // 配置時間格式
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd"));

        converter.setObjectMapper(objectMapper);
        return converter;
    }
}
  • 使用建立一個config類,使用 MappingJackson2HttpMessageConverter 類,手動新增json相關的配置

  • 可能出現的問題:建立配置類,必須在類上新增註解 @Configuration,且在方法上加上 @Bean,只有這樣配置才會生效。
    結果如下:
    在這裡插入圖片描述
    注:此處可能產生的問題是:配置類寫了,沒有達到預期的效果,可能是 bean 類中該欄位註解沒有去掉

  • json 格式資料在前後分離的時代,是非常重要的一種資料格式,因此HttpMessageConverter 也變的很重要,我們可以在此相關類中配置相應的規則

  • springboot提供的相關配置類 JacksonHttpMessageConvertersConfiguration MappingJackson2HttpMessageConverter

希望自己能一直保持初衷,文章一直寫下去,和大家一起成長

本系列程式碼github地址:https://github.com/shanggushenlong/springboot-demo

相關文章