聊聊@RequestBody和Json之间的关系

作者:张超帅 时间:2023-11-27 03:31:45 

在使用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

来源:https://blog.csdn.net/weixin_38070406/article/details/80901216

标签:@RequestBody,Json
0
投稿

猜你喜欢

  • java LockSupport实现原理示例解析

    2023-05-14 06:43:05
  • 谈谈Android的三种网络通信方式

    2023-04-19 17:28:47
  • JVM 运行时数据区与JMM 内存模型

    2022-08-12 10:49:27
  • C#简单输出日历的方法

    2023-11-13 05:56:10
  • Idea springboot如何实现批量启动微服务

    2022-09-08 09:04:07
  • C#实现进制转换

    2021-11-22 11:52:13
  • JAVA面试题之Forward与Redirect的区别详解

    2023-11-25 02:27:15
  • C#设置文件权限的方法

    2022-08-31 22:35:42
  • Android使用RSA加密实现接口调用时的校验功能

    2023-11-06 15:24:51
  • Android开发笔记之:Handler Runnable与Thread的区别详解

    2023-11-10 12:29:01
  • Java的动态绑定与双分派_动力节点Java学院整理

    2021-07-14 11:18:50
  • Java注解Annotation原理及自定义注解代码实例

    2023-04-30 10:18:09
  • Java Comparable 和 Comparator 的详解及区别

    2023-07-05 10:41:44
  • Java import导入及访问控制权限修饰符原理解析

    2023-08-17 21:42:59
  • C#实现对Json字符串处理实例

    2023-06-21 08:26:24
  • Android监听系统来电并弹出提示窗口

    2021-10-26 05:32:46
  • C# 实现FTP上传资料的示例

    2023-10-31 21:19:40
  • Android APP编写简单答题器

    2021-05-29 13:00:17
  • 浅谈spring的重试机制无效@Retryable@EnableRetry

    2021-12-12 10:42:57
  • ssm mybatis如何配置多个mapper目录

    2021-12-06 14:08:25
  • asp之家 软件编程 m.aspxhome.com