目录
- 第一章、快速了解JSON
- 1.1)JSON是什么
- 1.2)json的语法格式
- ①键值对、字符串、数字、布尔值、数组、对象
- ②嵌套的格式
- 1.3)为什么使用JSON
- 第二章、发送和接收JSON格式数据
- 2.1)postman发送JSON格式数据
- 2.2)Java后端接收数据
- 2.2.1)后端不写任何注解情况下接收参数
- 情况A:后端不写注解postman发出get请求
- 情况B:后端不写注解postman发出post请求
- 2.2.2)后端写@RequestParam注解接收参数
- 情况A:postman发出post请求
- 情况B:postman发出get请求
- 2.2.3)后端写@RequestBody注解接收参数
- 情况A:postman发出post请求
- 情况B:postman发出get请求
- @RequestParam和@RequestBody总结
- 第三章、JSON与其他格式数据的互相转换
- 3.1)其他格式数据转为JSON格式数据
- 3.6)JSON格式数据转为其他格式数据
友情提醒:
先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。
第一章、快速了解JSON
1.1)JSON是什么
①JSON简单介绍
一种轻量级的数据交换格式,采用键值对的方式表示数据。常用于 Web 应用程序中的数据传输。
PS:JSON格式可以使用一些转义字符。
②json格式:
在这六个构造字符的前或后允许存在无意义的空白符
[ 左方括号
{ 左大括号
] 右方括号
} 右大括号
: 冒号
, 逗号
③JSON的键和值
1、JSON 的键是一个 String 类型的字符串。字符串必须使用双引号""
2、值(value):值可以是对象、数组、数字、字符串、布尔值或null。JSON支持复杂的数据结构,可以嵌套对象和数组。
1.2)json的语法格式
①键值对、字符串、数字、布尔值、数组、对象
{"name":"John"} //键值对
"Hello, World!" //字符串
123或3.14 //数字:整数或浮点数
true或false //布尔值
[1, 2, 3, 4, 5] //数组结构
{"name": "John","age": 30,"city": "New York"} //对象结构
②嵌套的格式
1、对象中有对象
{
"name": "John","age": 30,
"address": {"street": "123 Main St","city": "New York"}
}
传输测试:
2、多个对象在数组中
[
{"name": "John","age": 30},
{"name": "Jane","age": 25}
]
传输测试
3、对象中包含数组结构,和对象属性
{"id":1,"name":"张三","age":18,"job":{"jobName":"Java开发","company":"某知名大厂"},"nickName":["张三","法外狂徒","传奇人物"]
}
传输测试
1.3)为什么使用JSON
①为什么使用
JSON具有简洁性,可读性,跨语言支持,数据结构灵活,数据传输效率高的特点。
②使用场景
①前后端数据交互:将服务器端的数据以 JSON 格式发送给前端,前端再使用 JavaScript 解析JSON数据后再展示和处理。
②API接口设计:使用 JSON 作为数据交换格式。通过将数据以 JSON 格式发送到 API 接口,可以实现数据的传输和交互。
③数据存储:将数据序列化为 JSON 格式后存储在文件或数据库中,并在需要时重新解析为对象。
④日志记录:将复杂的结构化数据以 JSON 格式记录下来。
⑤配置文件:JSON可以用于表示配置文件,例如Web应用程序的配置信息。
第二章、发送和接收JSON格式数据
2.1)postman发送JSON格式数据
比较简单直接查看这个文章就好了:
postman的下载安装和使用
2.2)Java后端接收数据
注意:后端接收参数大概四种情况:
①不写任何注解
②写@RequestParam注解,多个@RequestParam注解
③写@RequestBody
④写@RequestParam注解同时又写@RequestBody
2.2.1)后端不写任何注解情况下接收参数
情况A:后端不写注解postman发出get请求
①后端参数类型为Integer,发送参数String “1”,结论接收成功
②后端参数类型为String,发送参数为String “1”,结论接收成功
③后端参数类型为一个Integer,一个String。发送参数方式为form-data 为key(pid) value(1),key(eid) value(“1”),结论接收成功
④后端参数类型为一个Integer,一个String,发送参数方式为JSON{“eid”:“1”,“pid”:1} ,结论接受到的俩个值为NULL值
postman页面
⑤后端参数类型为一个数组,接收多个同名参数,结论接收成功
postman页面
⑥后端参数类型为map,接收多个不同名参数,结论失败
postmanye页面
⑦后端参数类型为一个实体类,发送参数方式为JSON{“eid”:“1”,“pid”:1} ,结论对象参数的属性值为null
postman页面
情况B:后端不写注解postman发出post请求
①后端参数类型为Integer,发送参数为String “1”,结论接收成功
②后端参数类型为String,发送参数为String “1”,结论接收成功
③后端参数类型为一个Integer,一个String。发送参数方式为form-data 为key(pid) value(1),key(eid) value(“1”),结论接收成功
④后端参数类型为一个Integer,一个String,发送参数方式为JSON{“eid”:“1”,“pid”:1} ,结论失败,两个值为NULL值
⑤后端参数类型为一个数组,接收多个同名参数,结论接收成功
⑥后端参数类型为map,接收多个不同名参数,结论失败
⑦后端参数类型为一个实体类,发送参数方式为JSON{“eid”:“1”,“pid”:1} ,结论失败,对象参数的属性值为null
2.2.2)后端写@RequestParam注解接收参数
情况A:postman发出post请求
①后端参数类型为Integer,发送参数为String “1”,结论接收成功
②后端参数类型为String,发送参数为String “1”,结论接收成功
③后端参数类型为一个Integer,一个String。发送参数方式为form-data 为key(pid) value(1),key(eid) value(“1”),结论接收成功
④后端参数类型为一个Integer,一个String,发送参数方式为JSON{“eid”:“1”,“pid”:1} ,结论失败bad request
⑤后端参数类型为一个数组,接收多个同名参数,结论接收成功
注意:不同名的不会存入
请求:
如果传递的三个参数有两个与数组参数同名会存入数组,不同名的则不会被存入数组
传参:两个与数组参数同名,一个不同名
⑥使用Map去接收请求参数,接收成功
postman请求:
⑦后端参数类型为一个实体类,发送参数方式为JSON{“eid”:“1”,“pid”:1} ,结论失败,Bad Request
@RequestParam不能注解实体类参数
postman页面
情况B:postman发出get请求
①后端参数类型为Integer,发送参数为String “1”,结论接收成功
②后端参数类型为String,发送参数为String “1”,结论接收成功
③后端参数类型为一个Integer,一个String。发送参数方式为form-data 为key(pid) value(1),key(eid) value(“1”),结论接收成功
④后端参数类型为一个Integer,一个String,发送参数方式为JSON{“eid”:“1”,“pid”:1} ,结论失败bad request
⑤后端参数类型为一个数组,接收多个同名参数,结论接收成功
不同名的不会存入
⑥后端参数类型为map,接收多个不同名参数,结论成功
⑦后端参数类型为一个实体类,发送参数方式为JSON{“eid”:“1”,“pid”:1} ,结论失败,Bad Request
@RequestParam不能注解实体类参数
2.2.3)后端写@RequestBody注解接收参数
@RequestBody(只能接收JSON字符串)
情况A:postman发出post请求
①后端参数是Integer,传参数是数字 1 ,结论成功。
json的value为" " :后端对应属性是String类型的,那么接受到的就是" ",如果后端属性的类型是Integer、Double等,那么接收到的就是null。
json的value为null:后端对应收到的就是null。
②后端参数是String,传参数是字符串 1,结论成功
③后端参数是Integer,传参数是json {“eid”:1},结论失败 bad request
④后端参数是一个简单对象,发送参数方式为JSON{“eid”:“1”,“pid”:1}
会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且key对应的值符合实体类对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性。
postman页面
⑥@RequestBody与@RequestParam()同时使用:
Controller:
postman页面:
情况B:postman发出get请求
@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。
@RequestParam和@RequestBody总结
①@RequestParam用来绑定查询参数(也就是在URL上的参数)和from data(也就是请求体,对应postman中的 from-data)。发起请求时在URL上和使用from data传参都可以使用 @RequestParam来接收。
②@RequestParam将接收到的字符串自动转化为对应的类型
③@RequestParam不支持直接传递实体类的方式,可接收Map和数组,可接收单个参数。
④@RequestParam注解的属性
1、如果参数前写了@RequestParam(xxx),那么前端发送的请求路径中必须有对应的xxx参数才行
2、value:请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。
3、name:作用同value相同
4、required:表示请求中一定要传入对应的参数,如果设置为false时,当请求中没有此参数,将会默认为null
5、defaultValue:参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。注意默认值可以使用SpEL表达式,如"#{systemProperties[‘java.vm.version’]}"
@RequestParam(value = "参数名",required = false,defaultValue = "12")
⑤一个请求中@RequestBody最多只能有一个,而@RequestParam()可以有多个。它们可以同时使用。
⑥@RequestParam指定接收的参数可以是普通元素、数组、集合、对象等等,@RequestBody接收的是请求体里面的数据
⑦如果参数是放在请求体中,以application/json的格式传入后台接口,那么后台要@RequestBody才能接收到;如果不是放在请求体中的话要用@RequestParam来接收,或者在形参前不贴@RequestParam注解也能接收。
⑧feign或者openfeign远程调用服务时,如果参数前什么也不写,那么会被默认是@RequestBody。
第三章、JSON与其他格式数据的互相转换
3.1)其他格式数据转为JSON格式数据
将不同的数据格式与JSON格式进行转换需要依赖第三方包
JSON //json官方提供的
FastJson //阿里巴巴提供
Jackson //springboot启动包自带
GSON //Google提供的
第三方包有很多,选择一种就好了,这里选择Jackson介绍
jackSon解析JSON,SpringMVC内置的解析器就是这个
springboot启动包也有jackson
maven依赖:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.8</version>
</dependency>
①对象类型转json,比如我有一个loanInfo对象
// 创建ObjectMapper对象ObjectMapper objectMapper = new ObjectMapper();String jsonString="";try {// 将对象转换为JSON字符串jsonString = objectMapper.writeValueAsString(loanInfo);} catch (JsonProcessingException e) {e.printStackTrace();}return jsonString;
生成json字符串
ArrayList<Student> students = new ArrayList<>();
for (int i = 0; i < 3; i++) {students.add(new Student(100 + i, "二稿" + i, 1000 + i));
}
Grade grade = new Grade(22, "语文", students);
ObjectMapper objectMapper = new ObjectMapper();
String s = objectMapper.writeValueAsString(grade);
System.out.println(s);
解析JSON字符串
// 对象嵌套数组嵌套对象
String json1 = "{\"id\":1,\"name\":\"JAVAEE-1703\",\"stus\":[{\"id\":101,\"name\":\"刘一\",\"age\":16}]}";
// 数组
String json2 = "[\"北京\",\"天津\",\"杭州\"]";ObjectMapper mapper = new ObjectMapper();
Grade grade = mapper.readValue(json1, Grade.class);
System.out.println(grade);List<String> list = mapper.readValue(json2, newTypeReference<List<String>>() {});
System.out.println(list)