聊聊@RequestBody和Json之间的关系

 更新时间:2021年06月07日 15:18:55   作者:张超帅  
这篇文章主要介绍了@RequestBody和Json之间的关系,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

在使用springmvc的时候,后台@RequestBody接受的是一个json格式的字符串,一定是一个字符串。

我们可以通过@RequestBody Map

    @RequestMapping(value="/queryAccountList.do",produces="application/json;charset=UTF-8")
    @ResponseBody
    public HashMap<String, Object> queryAccountList(@RequestBody Map<String, Object> paramsMap){
        System.out.println("paramsMap="+paramsMap);
        String  channel= (String) paramsMap.get("channel");
        String function_code=(String) paramsMap.get("function_code");
        Map<String, Object> reqParam=(Map<String, Object>)paramsMap.get("data");

当前端调用我们的接口时,传入json字符串,就转为了map对象。这里主要是@RequestBody的底层实现,我们不讨论。

json对象和json字符串的区别:

var person={“name”:”zhangsan”,”sex”:”男”,”age”:”24”}//json对象
var person='{“name”:”zhangsan”,”sex”:”男”,”age”:”24”}';//json字符串

json对象转为json字符串,调用stringify方法:

var person={"name":"zhangsan","sex":"男","age":"24"};//json对象
var personString = JSON.stringify(person);
alert(personString);

SpringMVC接受json字符串类型

在SpringMVC中基于REST开发时,前端传入后台的应该是一个json格式的字符串,而不是一个json对象

GET、POST方式提时, 根据request header Content-Type的值来判断:

application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);

multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);

其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理)。

@RequestBody 处理类型 和 对象 和 json相互转换

1 @RequestBody 处理类型

在项目中经常看到controller 中有 @RequestBody 字样,他到底有什么作用?

一般使用表单提交数据时不需要使用@RequestBody 即可自动封装数据到对应的 Bean 中。@RequestBody 用来处理Content-Type: application/json, application/xml等

它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。

说明:使用 @RequestBody 解析数据需要添加 jackson 或 fastjson 依赖包。

maven 引入 fastjson 包

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.51</version>
</dependency>

2 对象 和 json 相互转换

在项目中经常会遇到对象和 json 之间相互转换,公共类 和 json 对象转换, 静态内部类 和 json 对象转换

2.1 没有内部类时 Student 类

@Data
public class Student {
    private String id;
    private String name;
    private int age;
    private String sex;
@Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }
}

json 和 对象 相互转换

public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        Student student = new Student();
        student.setName("good");
        String s = mapper.writeValueAsString(student);
        System.out.println(s);
        Student hd2 = mapper.readValue(s, Student.class);
        System.out.println(hd2);
    }

2.2 有静态内部类时 Student 类

@Data
public class Student {
    private String id;
    private String name;
    private int age;
    private String sex;
    private HomeData homeData;
    private BigDecimal salary;
    private String[] tel;
    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }
    @Data
    public static class HomeData{
        private Address address;
        @Override
        public String toString() {
            return ToStringBuilder.reflectionToString(this);
        }
        @Data
        public static class Address {
            private String country;
            private String city;
            @Override
            public String toString() {
                return ToStringBuilder.reflectionToString(this);
            }
        }
    }
}

json 和 对象 之间相互转换

public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        Student student = new Student();
        Student.HomeData homeData = new Student.HomeData();
        Student.HomeData.Address address = new Student.HomeData.Address();
        address.setCountry("中国");
        address.setCity("上海");
        homeData.setAddress(address);
        student.setHomeData(homeData);
        String s = mapper.writeValueAsString(address);
        System.out.println(s);
        Student.HomeData.Address hd2 = mapper.readValue(s, Student.HomeData.Address.class);
        System.out.println(hd2);
    }

说明:主要方法有 mapper.writeValueAsString 和 mapper.readValue

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java多线程编程中synchronized关键字的基础用法讲解

    Java多线程编程中synchronized关键字的基础用法讲解

    Java的synchronized关键字用于修饰线程同步,用以线程资源共享的目的等,下面就带来简单的Java多线程编程中synchronized关键字的基础用法讲解
    2016-06-06
  • 浅谈Java回收对象的标记和对象的二次标记过程

    浅谈Java回收对象的标记和对象的二次标记过程

    这篇文章主要介绍了浅谈Java回收对象的标记和对象的二次标记过程的相关内容,小编觉得还是挺不错的,这里给大家分享一下,需要的朋友可以参考。
    2017-10-10
  • Spring Boot 文件上传与下载的示例代码

    Spring Boot 文件上传与下载的示例代码

    这篇文章主要介绍了Spring Boot 文件上传与下载的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 基于springboot实现文件上传

    基于springboot实现文件上传

    这篇文章主要为大家详细介绍了基于springboot实现文件上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 使用Spirng Boot Admin监控Spring Cloud应用项目

    使用Spirng Boot Admin监控Spring Cloud应用项目

    这篇文章主要介绍了使用Spirng Boot Admin监控Spring Cloud应用项目,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Java 设计模式以虹猫蓝兔的故事讲解建造者模式

    Java 设计模式以虹猫蓝兔的故事讲解建造者模式

    建造者模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。本文将通过示例讲解建造者模式,需要的可以参考一下
    2022-04-04
  • 分享Java8中通过Stream对列表进行去重的实现

    分享Java8中通过Stream对列表进行去重的实现

    本文主要介绍了分享Java8中通过Stream对列表进行去重的实现,包括两种方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Java Spring数据单元配置过程解析

    Java Spring数据单元配置过程解析

    这篇文章主要介绍了Java Spring数据单元配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • springboot自定义starter方法及注解实例

    springboot自定义starter方法及注解实例

    这篇文章主要为大家介绍了springboot自定义starter方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 使用Java实现一个解析CURL脚本小工具

    使用Java实现一个解析CURL脚本小工具

    文章介绍了如何使用Java实现一个解析CURL脚本的工具,该工具可以将CURL脚本中的Header解析为KV Map结构,获取URL路径、请求类型,解析URL参数列表和Body请求体,感兴趣的小伙伴跟着小编一起来看看吧
    2025-02-02

最新评论