JsonNode是Jackson库中的一个类,用于解析和操作JSON数据,是一个树形结构的数据,可以用于读写JSON文件、数据的验证、数据的过滤、数据的查询等。
一、基本使用
在使用JsonNode时需要先将JSON字符串解析成JsonNode对象,可以使用ObjectMapper进行解析:
String json = "{ "name" : "John", "age" : 30 }";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);
其中JsonNode对象的属性可以用get()方法获取,数字类型可以用asInt()等方法获取类型对应的值:
JsonNode nameNode = node.get("name");
String name = nameNode.asText();
JsonNode ageNode = node.get("age");
int age = ageNode.asInt();
也可以通过path()方法获取属性值,如果属性不存在则返回null:
String name = node.path("name").asText();
int age = node.path("age").asInt();
除了基本数据类型外,JsonNode还可以表示数组和对象:
String json = "{ "name" : "John", "age" : 30, "hobbies" : [ "Coding", "Swimming" ] }";
JsonNode node = mapper.readTree(json);
JsonNode hobbiesNode = node.get("hobbies");
for (JsonNode hobbyNode : hobbiesNode) {
String hobby = hobbyNode.asText();
System.out.println(hobby);
}
二、数据的操作
1. 添加删除属性
我们可以使用JsonNode的with()方法返回一个新的JsonNode对象,新对象中包含原来的数据和新增的属性:
String json = "{ "name" : "John", "age" : 30 }";
JsonNode node = mapper.readTree(json);
JsonNode newNode = node.with("gender", "male");
也可以使用set()方法将原来的属性值修改:
JsonNode ageNode = node.get("age");
if (ageNode != null && ageNode.isInt()) {
((ObjectNode)node).set("age", ageNode.asInt() + 1);
}
删除属性可以使用remove()方法:
((ObjectNode)node).remove("age");
2. 过滤数据
JsonNode提供了filter()、findParents()、findParentsOf()等方法来进行数据的过滤。filter()方法可以根据条件过滤出符合条件的数据:
String json = "{ "name" : "John", "age" : 30, "hobbies" : [ "Coding", "Swimming" ] }";
JsonNode node = mapper.readTree(json);
JsonNode hobbiesNode = node.path("hobbies").filter(n -> n.asText().equals("Coding")).get(0);
findParents()方法可以返回指定属性的父级节点:
JsonNode parentsNode = node.findParents("hobbies");
3. 数据的查询
JsonNode提供了at()、findValue()、path()等方法来进行数据的查询。at()方法可以根据JsonPath表达式查询数据:
String json = "{ "name" : { "first" : "John", "last" : "Doe" }, "age" : 30 }";
JsonNode node = mapper.readTree(json);
JsonNode lastNameNode = node.at("/name/last");
findValue()方法可以查询指定属性名的值:
JsonNode nameNode = node.findValue("name");
三、异常处理
在使用JsonNode时,有可能出现解析错误、类型转换错误等异常情况,可以通过try-catch块来进行异常处理:
try {
JsonNode node = mapper.readTree(json);
} catch (JsonProcessingException e) {
System.out.println("解析错误:" + e.getMessage());
} catch (IOException e) {
System.out.println("IO错误:" + e.getMessage());
} catch (Exception e) {
System.out.println("其他错误:" + e.getMessage());
}
四、总结
JsonNode是Jackson库中的一个重要类,可以方便地进行JSON数据的解析、操作和查询。在实际开发中,应该根据具体需求灵活运用JsonNode提供的方法,加快开发效率。
