总结一下Spring中一些解析json数据的技巧。
@RequestBody
注解常用来处理content-type
不是默认的application/x-www-form-urlcoded
编码的内容,比如application/json
或者是application/xml
等。一般情况下来说常用其来处理application/json
类型。
@RequestBody
的修饰对象的控制器方法形参,一般用于修饰JavaBean形参,其可以将请求体中的JSON字符串绑定到修饰的bean上。也可以修饰字符串,会将请求体的参数以key1=value1&key2=value2&...
的格式复制给String控制器参数。
修饰JavaBean时,json字符串要与JavaBean的属性对应,且要注意@RequestBody不能将JSON对象数组解析为List集合,即@RequestBody只能处理Json对象数据,不能处理JSON对象数组。但若是JavaBean中包含List类型的属性是可以解析的。
?
示例:
JavaBean:
public class Role {
private int id;
private String roleName;
//getter、setter、toString
}
public class Person {
private String name;
private Integer age;
private List<Role> roles;
//getter、setter、toString
}
?
Controller:
@RestController
public class DataResolveController {
@PostMapping("/doJsonObject")
public String resolveJsonObject(@RequestBody Person person){
System.out.println(person);
return "ok";
}
}
?
在前端发送Ajax:
application/json
。<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
</head>
<body>
<h1>Test @RequestBody</h1>
<button id="send">send ajax</button>
<script>
$("#send").click(function () {
var person = {
"name":"白小纯",
"age":"20",
"roles":[
{"id":"1","roleName":"医生"},
{"id":"2","roleName":"老师"}
]};
$.ajax({
type: "POST",
url: "doJsonObject",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(person),
dataType: "json",
});
})
</script>
</body>
</html>
?
点击按钮,后台输出:
Person{name=‘白小纯‘, age=20, roles=[Role{id=1, roleName=‘医生‘}, Role{id=2, roleName=‘老师‘}]}
?
来自参考连接
Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一 。 Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快;Jackson 运行时占用内存比较低,性能比较好;Jackson 有灵活的 API,可以很容易进行扩展和定制。
Jackson 的 1.x 版本的包名是 org.codehaus.jackson ,当升级到 2.x 版本时,包名变为 com.fasterxml.jackson。
Jackson 的核心模块由三部分组成。
?
对于SpringMVC项目,需要导入依赖(maven):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
对于SpringBoot项目,依赖spring-boot-starter-web
中就包括了Jackson的依赖。所以无需导入。
?
Jackson的一个主要类就是ObjectMapper
,通过该类的readValue()
方法可以将json字符串解析为指定对象。
?
示例:
JavaBean使用上述的Person和Role。
@Test
void testJackson() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
String personJson = "{\"name\":\"白小纯\", \"age\":\"20\", \"roles\":[{\"id\":\"1\",\"roleName\":\"医生\"}, " +
"{\"id\":\"2\",\"roleName\":\"老师\"}]}";
Person person = mapper.readValue(personJson, Person.class);
System.out.println(person);
}
输出:
Person{name=‘白小纯‘, age=20, roles=[Role{id=1, roleName=‘医生‘}, Role{id=2, roleName=‘老师‘}]}
?
通过ObjectMapper
对象的writeValueAsString()
方法实现。
示例:
public void testObjectToJson() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
Person person = new Person();
List<Role> roles = new ArrayList<>();
Role role1 = new Role();
Role role2 = new Role();
role1.setId(1);
role1.setRoleName("学生");
role2.setId(2);
role2.setRoleName("班长");
roles.add(role1);
roles.add(role2);
person.setAge(20);
person.setName("王大锤");
person.setRoles(roles);
String personStr = mapper.writeValueAsString(person);
System.out.println(personStr);
}
?
输出:
{"name":"王大锤","age":20,"roles":[{"id":1,"roleName":"学生"},{"id":2,"roleName":"班长"}]}
?
readValue()
方法可以解析JSON对象数组字符串为List集合,同样的,writeValueAsString()
方法可以将List集合中的多个对象解析为Json对象数组字符串。
?
示例:
注意readValue()
方法的第二个参数
public void testJsonTOList() throws JsonProcessingException {
String rolesStr = "[{\"id\":1,\"roleName\":\"快递员\"},{\"id\":2,\"roleName\":\"程序员\"}]";
ObjectMapper mapper = new ObjectMapper();
List<Role> roles = mapper.readValue(rolesStr, new TypeReference<List<Role>>() {});
System.out.println(roles);
String jsonArray = mapper.writeValueAsString(roles);
System.out.println(jsonArray);
}
?
输出:
[Role{id=1, roleName=‘快递员‘}, Role{id=2, roleName=‘程序员‘}]
[{"id":1,"roleName":"快递员"},{"id":2,"roleName":"程序员"}]
?
Jackson使用详解--掘金 三分恶(想要深入了解Jackson可以看这篇博客,巨详细)
?
原文:https://www.cnblogs.com/bxiaoo/p/13967250.html