当前位置:   article > 正文

Jackson使用详解_jackson-databind

jackson-databind

1. Jackson介绍

Jackson一个java处理json的类库,社区活跃,更新速度也很快。相比gson、fastjson等,强力推荐使用Jackson。

Jackson 有三个核心包,分别是 Streaming、Annotations、Databind,通过这些包可以方便的对 JSON 进行操作。
Streaming 在 jackson-core 模块。定义了一些低级别流处理相关的API以及特定的JSON实现。
Annotations 在 jackson-annotations 模块,包含了Jackson中的注解。
Databind 在 jackson-databind 模块, 在Streaming包的基础上实现了数据绑定,依赖于Streaming和Annotations包。

2. Jackson maven引入

我们需要引入以上三个核心模块,不过由于jackson-databind依赖了jackson-core和 jackson-annotations,所以只需要引入jackson-databind即可。

  1. <dependency>
  2. <groupId>com.fasterxml.jackson.core</groupId>
  3. <artifactId>jackson-databind</artifactId>
  4. <version>2.13.2</version>
  5. </dependency>
  6. <!--
  7. <dependency>
  8. <groupId>com.fasterxml.jackson.core</groupId>
  9. <artifactId>jackson-annotations</artifactId>
  10. <version>2.13.2</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.fasterxml.jackson.core</groupId>
  14. <artifactId>jackson-core</artifactId>
  15. <version>2.13.2</version>
  16. </dependency>
  17. -->

3. 主要类和api介绍

ObjectMapper

ObjectMapper提供了读写JSON的功能,既可以读写基本pojo,也可以读写通用JSON树模型(JsonNode),还提供了执行转换的相关功能。之所以称为ObjectMapper就是因为他负责json和java对象之间的映射转换。(对于时间类型的转换,要注意字符串的时间格式,不满足则使用objectMapper.setDateFormat来设置时间格式)常用的方法如:

1)readValue方法将json反序列化为java对象

readValue接收参数 Class/JavaType/TypeReference,JavaType只能通过com.fasterxml.jackson.databind.type.TypeFactory来创建,TypeReference是抽象类,直接new匿名实现即可。比如构造 Map<String, Object>,

new TypeReference<Map<String, Object>>() {};
objectMapper.getTypeFactory().constructMapType(Map.class, String.class, Object.class);

2)writeValue方法将对象序列化成指定目标

3)readTree方法将json反序列化为JsonNode

4)valueToTree方法将java对象转换为JsonNode

 

5)treeToValue方法将JsonNode转换为java对象

JsonNode

 所有JSON节点的基类,它构成了Jackson实现的JSON树模型(JSON Tree Model)的基础。可以将其视为类似于XML DOM树中的DOM节点。若想修改或访问 json 部分属性,树模型是不错的选择。程序中常用的子类是ObjectNode。

1)xxxValue方法 返回该节点的对应类型值(和asXXX的区别就是asXXX有个转换的过程)

2)get 方法获取到某个节点

3)findValue方法查找某个节点

4. 使用案例

包含 json字符串转换为 java对象,json字符串转换为 java map,json数组转换为 java list,java对象转换为 json字符串,树模型处理获取 json字符串里某个字段值,修改 json字符串里的字段值等。

代码示例如下:

  1. public class Test {
  2. public static void main(String[] args) throws JsonProcessingException {
  3. String jsonStr = "{\"userId\":1001,\"userName\":\"iouy\",\"city\":\"chengdu\",\"age\":21,\"sex\":1," +
  4. "\"phone\":\"15227654561\",\"address\":\"凤凰大街118号\",\"registerTime\":\"2024-03-11 13:11:11\"}";
  5. ObjectMapper objectMapper = new ObjectMapper();
  6. String jsonArray = "[{\"userId\":1001,\"userName\":\"iouy\",\"city\":\"chengdu\",\"age\":21,\"sex\":1," +
  7. "\"phone\":\"15227654561\",\"address\":\"凤凰大街118号\",\"registerTime\":\"2024-03-11 13:11:11\"}," +
  8. "{\"userId\":1002,\"userName\":\"kdas\",\"city\":\"chengdu\",\"age\":22,\"sex\":0," +
  9. "\"phone\":\"15127654561\",\"address\":\"凤凰大街111号\",\"registerTime\":\"2022-03-11 12:13:13\"}]";
  10. // json字符串转换为 java对象
  11. Person person = objectMapper.readValue(jsonStr, Person.class);
  12. System.out.println("json字符串转换为 java对象");
  13. System.out.println(person);
  14. // json字符串转换为 java map
  15. Map<String, Object> jsonMap = objectMapper.readValue(jsonStr, Map.class);
  16. // 或者通过以下两种方式传参
  17. // Map<String, Object> jsonMap = objectMapper.readValue(jsonStr, objectMapper.getTypeFactory().constructMapType(Map.class, String.class, Object.class));
  18. // Map<String, Object> jsonMap = objectMapper.readValue(jsonStr, new TypeReference<Map<String, Object>>() {});
  19. System.out.println("json字符串转换为 java map");
  20. System.out.println(jsonMap);
  21. //json数组转换为 java list
  22. List<Person> personList = objectMapper.readValue(jsonArray, new TypeReference<List<Person>>() {});
  23. System.out.println("json数组转换为 java list");
  24. System.out.println(personList);
  25. // java对象转换为 json字符串
  26. String jsonStrFromJavaPerson = objectMapper.writeValueAsString(person);
  27. System.out.println("java对象转换为 json字符串");
  28. System.out.println(jsonStrFromJavaPerson);
  29. // 树模型处理
  30. // 获取 json字符串里某个字段值
  31. JsonNode jsonNode = objectMapper.readTree(jsonStr);
  32. System.out.println("获取json字符串里的 city字段值");
  33. System.out.println(jsonNode.get("city").textValue());
  34. // 修改 json字符串里的 city值
  35. ObjectNode objectNode = (ObjectNode) jsonNode;
  36. objectNode.put("city", "city_change");
  37. System.out.println("修改city值后的json字符串为");
  38. System.out.println(objectNode.toString());
  39. }
  40. public static class Person {
  41. private long userId;
  42. private String userName;
  43. private String city;
  44. private int age;
  45. private int sex;
  46. private String phone;
  47. private String address;
  48. private String registerTime;
  49. public Person() {
  50. }
  51. public long getUserId() {
  52. return userId;
  53. }
  54. public void setUserId(long userId) {
  55. this.userId = userId;
  56. }
  57. public String getUserName() {
  58. return userName;
  59. }
  60. public void setUserName(String userName) {
  61. this.userName = userName;
  62. }
  63. public String getCity() {
  64. return city;
  65. }
  66. public void setCity(String city) {
  67. this.city = city;
  68. }
  69. public int getAge() {
  70. return age;
  71. }
  72. public void setAge(int age) {
  73. this.age = age;
  74. }
  75. public int getSex() {
  76. return sex;
  77. }
  78. public void setSex(int sex) {
  79. this.sex = sex;
  80. }
  81. public String getPhone() {
  82. return phone;
  83. }
  84. public void setPhone(String phone) {
  85. this.phone = phone;
  86. }
  87. public String getAddress() {
  88. return address;
  89. }
  90. public void setAddress(String address) {
  91. this.address = address;
  92. }
  93. public String getRegisterTime() {
  94. return registerTime;
  95. }
  96. public void setRegisterTime(String registerTime) {
  97. this.registerTime = registerTime;
  98. }
  99. @Override
  100. public String toString() {
  101. return "Person{" +
  102. "userId=" + userId +
  103. ", userName='" + userName + '\'' +
  104. ", city='" + city + '\'' +
  105. ", age=" + age +
  106. ", sex=" + sex +
  107. ", phone='" + phone + '\'' +
  108. ", address='" + address + '\'' +
  109. ", registerTime='" + registerTime + '\'' +
  110. '}';
  111. }
  112. }
  113. }

运行结果如下:

  1. json字符串转换为 java对象
  2. Person{userId=1001, userName='iouy', city='chengdu', age=21, sex=1, phone='15227654561', address='凤凰大街118号', registerTime='2024-03-11 13:11:11'}
  3. json字符串转换为 java map
  4. {userId=1001, userName=iouy, city=chengdu, age=21, sex=1, phone=15227654561, address=凤凰大街118号, registerTime=2024-03-11 13:11:11}
  5. json数组转换为 java list
  6. [Person{userId=1001, userName='iouy', city='chengdu', age=21, sex=1, phone='15227654561', address='凤凰大街118号', registerTime='2024-03-11 13:11:11'}, Person{userId=1002, userName='kdas', city='chengdu', age=22, sex=0, phone='15127654561', address='凤凰大街111号', registerTime='2022-03-11 12:13:13'}]
  7. java对象转换为 json字符串
  8. {"userId":1001,"userName":"iouy","city":"chengdu","age":21,"sex":1,"phone":"15227654561","address":"凤凰大街118号","registerTime":"2024-03-11 13:11:11"}
  9. 获取json字符串里的 city字段值
  10. chengdu
  11. 修改city值后的json字符串为
  12. {"userId":1001,"userName":"iouy","city":"city_change","age":21,"sex":1,"phone":"15227654561","address":"凤凰大街118号","registerTime":"2024-03-11 13:11:11"}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/960084
推荐阅读
相关标签
  

闽ICP备14008679号