您的位置:首页 > 编程语言 > Java开发

SpringBoot基础实战系列(二)springboot解析json与HttpMessageConverter

2020-06-06 07:00 405 查看

springboot解析json与HttpMessageConverter

  • @RequestBody
  • HttpMessageConverter
  • 希望自己能一直保持初衷,文章一直写下去,和大家一起成长

  • 上一篇:SpringBoot基础实战系列(一)整合视图
    下一篇:SpringBoot基础实战系列(三)springboot单文件与多文件上传

    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

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: