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.结果

springboot json定义动态表单 springboot @jsonfield_json

@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")
  • springboot json定义动态表单 springboot @jsonfield_json_02


  • springboot json定义动态表单 springboot @jsonfield_spring_03


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,只有这样配置才会生效。
  • 结果如下:
  • springboot json定义动态表单 springboot @jsonfield_json_04


  • 注:此处可能产生的问题是:配置类写了,没有达到预期的效果,可能是 bean 类中该字段注解没有去掉
  • json 格式数据在前后分离的时代,是非常重要的一种数据格式,因此HttpMessageConverter 也变的很重要,我们可以在此相关类中配置相应的规则
  • springboot提供的相关配置类 JacksonHttpMessageConvertersConfiguration MappingJackson2HttpMessageConverter

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

本系列代码github地址:https://github.com/shanggushenlong/springboot-demo