首先复习一下JSON
在标准的 json 格式中,json 对象由在括号括起来,对象中的属性也就是 json 的 key 是一个字符串,所以一定要使用 双引号引起来。每组 key 之间使用逗号进行分隔。
Json 定义格式:
var 变量名 = {
“key” : value , // Number 类型
“key2” : “value” , // 字符串类型
“key3” : [] , // 数组类型
“key4” : {}, // json 对象类型
“key5” : [{},{}] // json 数组
};
例如:
var jsons = {
"key1":"abc", // 字符串类型
"key2":1234, // Number
"key3":[1234,"21341","53"], // 数组
"key4":{ // json 类型
"key4_1" : 12,
"key4_2" : "kkk"
},
"key5":[{ // json 数组
"key5_1_1" : 12,
"key5_1_2" : "abc"
},
{
"key5_2_1" : 41,
"key5_2_2" : "bbj"
}]
};
所以,注意到JSON的key都是字符串,类型也只有几种(和Java不一样!)
JSON对象的访问:
json 对象,顾名思义,就知道它是一个对象。里面的 key 就是对象的属性。我们要访问一个对象的属性,只需要使 用【对象名.属性名】的方式访问即可。
alert(jsons.key1); // "abc"
// 访问 json 的数组属性
alert(jsons.key3[1]); // "21341"
// 访问 json 的 json 属性
alert(jsons.key4.key4_1);//12
// 访问 json 的 json 数组
alert(jsons.key5[0].key5_1_2);//"abc"
JSON 对象和字符串对象的互转:( 前端)
JSON.stringify( json );
: 此方法可以把一个 json 对象转换成为 json 字符串JSON.parse( jsonString);
:此方法可以把一个 json 字符串转换成为 json 对象
测试开始
放上我的实验:
首先在eolinker(postman)中设置url,在请求体中选择raw类型
{
"map" : {
"1" : 1,
"6" : 5,
"7" : "6"
},
"remarks" : "空备注"
}
直接用map接收:public RetJson testJson(@RequestBody Map<Object, Object> map, String remarks)
此时我发现debug得到的数据是:
也就是说,入参得到的,是一个LinkedHashMap<String, Object>
然后这个map中得到了两个数据:1. key是"map",然后value是一个LinkedHashMap (size = 3),这个map里面放了3条数据;
2. 第二个key就是remarks,然后这个的value就是String:“空备注”
所以用这个方式是无法获取到在参数中取到remarks(null)的,只可以从map里面取值;
所以如果说是用这种方法的话,可以换种方法就是在remarks前面加上@RequestParam,让前端传值的时候传在URL上面拼接参数;
经过实验,如果在map前面去掉@RequestBody的话,是无法解析得到map数据的。因此使用map的话这里一定要加上注解
复杂一点,如果要传许多map、list的话,怎么做呢?
还是用实体类来接收吧!
例如, 我写一个Json类来获取请求体里面的参数:
@Data
public class Json {
private Map<Object, Object> map;
private List<String> list;
private Map<String, List<Integer>> listMap;
private String string;
private Integer i;
private SmallJson smallJson;
}
其中SmallJson类:(注意一定要写getter和setter方法,否则会解析不出来;)
@Data
public class SmallJson {
private Integer si;
private String ss;
}
写个接口来接受参数:
@PostMapping("/test/testJson2")
public RetJson<Json> testJson2(@RequestBody Json json){
System.out.println(json);
return RetJson.success(json);
}
测试:使用eolinker(和postman一样,中文的)这里除了在eolinker使用raw类型之外,使用JSON(左2)来测试应该也可以的
{
"map" : {
"1" : 1,
"6" : 5,
"7" : "6"
},
"list" : ["1", 2, "33", "444",555],
"listMap" : {
"A" : [1,2,"3"],
"B" : [3,2,1]
},
"string" : "str",
"i" : 100,
"smallJson" : {
"si" : 99,
"ss" : 88
}
}
使用idea debug得到的数据:
返回打印的信息:
{
"code": 200,
"message": "操作成功",
"data": {
"map": {
"1": 1,
"6": 5,
"7": "6"
},
"list": ["1", "2", "33", "444", "555"],
"listMap": {
"A": [1, 2, 3],
"B": [3, 2, 1]
},
"string": "str",
"i": 100,
"smallJson": {
"si": 99,
"ss": "88"
}
}
}
可以看到:使用jackson可以帮我妈自动解析数据:
比如上面传的list和listMap中有的数据类型是不匹配的,jackson可以帮我们自动在String和Integer之间进行了转化。
其他在其他地方看到的知识:
比如说,还可以自定义转化器:
@Component
@RequiredArgsConstructor
public class StringToMapConverter implements Converter<String, Map<String, Object>> {
private final ObjectMapper objectMapper;
@Override
public Map<String, Object> convert(String source) {
try {
return objectMapper.readValue(source, new TypeReference<Map<String, String>>() {
});
} catch (final IOException e) {
return null;
}
}
}
除此之外,如果我们要传递文件的话,怎么办呢?
其实对于后端来说还是一样,比较简单:
然后使用eolinker测试的时候
记得还要改请求头为multipart/form-data;
不过我跟前端测试的时候弄了蛮久,因为前端传参数的时候,file名称弄错,还有没有仔细看element的文档😢
然后我后面进行了抓包,确实可以哦,比如这样:
主要就是注意这个boundry是分割的。其他的话只要和前端配合好就可以传了。