首页 > 编程语言 > 详细

Spring中处理json数据的总结

时间:2020-11-13 09:26:47      阅读:26      评论:0      收藏:0      [点我收藏+]

总结一下Spring中一些解析json数据的技巧。

@RequestBody注解

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

  • 注意发送ajax请求时,contentType要指定为application/json
  • person对象的属性与Person类一一对应,其中roles的属性值是一个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

Jackson简介

来自参考连接

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 的核心模块由三部分组成。

  • jackson-core,核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。
  • jackson-annotations,注解包,提供标准注解功能;
  • jackson-databind ,数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。

?

依赖

对于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的依赖。所以无需导入。

?

将JSON字符串解析为对象

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=‘老师‘}]}

?

将对象解析为json字符串

通过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":"班长"}]}

?

JSON对象数组字符串和Lsit

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":"程序员"}]

?

References

Jackson使用详解--掘金 三分恶(想要深入了解Jackson可以看这篇博客,巨详细)

?

Spring中处理json数据的总结

原文:https://www.cnblogs.com/bxiaoo/p/13967250.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!