聊聊@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


猜你喜欢
- 本文实例为大家分享C++二分查找算法,通过改变边界位置来进行查找的方法,代码如下:#include <iostream>usin
- 我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式。我们
- 在Springboot项目中使用分页插件的时候 发现PageHelper插件失效了我导入的是:后来才发<dependency>
- 现在以一个例子来介绍mybatis的动态SQL和模糊查询:通过多条件查询用户记录,条件为姓名模糊匹配,并且年龄在某两个值之间。新建表d_us
- 一般我们用它来自动帮我们注册APT文件(全称是Annotation Process Tool,或者叫注解处理器,AbstractProces
- 一、方法(Method)概念 1、Java 中的方法就是其他编程语言中的函数(Function) 2、方法的定义格式:①
- 代码如下一、创建 CountdownTimer.xaml 继承ContentControl代码如下。using?System;us
- 本文实例为大家分享了ftp实现文件上传下载的具体代码,供大家参考,具体内容如下package getUrlPic;import java.i
- Android 中倒计时验证两种常用方式实例详解短信验证码功能,这里总结了两种常用的方式,可以直接拿来使用。看图:说明:这里的及时从10开始
- 用户提出一个需求:当修改产品价格的时候,需要记录操作日志,什么时候做了什么事情。想必这个案例,只要是做过应用系统的小伙伴们,都应该遇到过吧?
- 前言早在2011年它作为安卓兼容库发布,在75%的应用中使用过,是最广泛使用的安卓库。它事实上不是一个单一的文件,而是一个集合,其中可以大致
- 前言作者:京东科技 张天赐JDK 8 是一次重大的版本升级,新增了非常多的特性,其中之一便是 CompletableFuture。
- 概述Selenium是一款免费的分布式的自动化测试工具,支持多种开发语言,无论是C、 java、ruby、python、或是C# ,你都可以
- 本文实例讲述了Android编程实现读取本地SD卡图片的方法。分享给大家供大家参考,具体如下:private Bitmap getDiskB
- 需要读取如图所示注册表【HKEY_LOCAL_MACHINE\SOFTWARE\EasyDrv7】节点下的【DateTime】的值直接上代码
- 会话会话:用户打开浏览器进行的一系列操作直至关闭浏览器的过程看作是一次会话HTTP协议是无状态的,不能实现跟踪对话。比如进入一个网站,每次操
- Android中的Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念
- 前言Java中URL传中文时乱码的问题相信不少朋友都遇到过,最近就遇到一个问题,就是在Action当中把一条中文信息绑定在URL的后面,Ac
- 1. Mybatis分页插件1.1 分页插件介绍分页可以将很多条结果进行分页显示。如果当前在第一页,则没有上一页。如果当前在最后一页,则没有
- 一、项目运行环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,