介绍JsonNode基本使用方法

JsonNode是Jackson库中的一个类,用于解析和操作json数据,是一个树形结构的数据,可以用于读写json文件、数据的验证、数据的过滤、数据的查询等。

1、基本使用

在使用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();

还可以表示数组和对象


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);
}

2、数据的操作

添加、删除属性
使用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");

过滤数据
JsonNode提供了filter()、findParents()、findParentOf()等方法过滤数据


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");

数据的查询
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());
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中解析JSON可以使用很多第三方库,其中比较流行的有Jackson、Gson、FastJson等。下面以Jackson为例,介绍一下如何使用递归循环解析JSON。 假设我们有以下JSON字符串: ```json { "name": "张三", "age": 20, "address": { "province": "广东", "city": "深圳", "district": "南山区" }, "hobby": [ "篮球", "游泳", "旅游" ] } ``` 我们可以先定义一个Java对象来存储解析后的JSON数据: ```java public class Person { private String name; private int age; private Address address; private List<String> hobby; // 省略getter和setter方法 } public class Address { private String province; private String city; private String district; // 省略getter和setter方法 } ``` 然后使用Jackson库进行解析: ```java ObjectMapper mapper = new ObjectMapper(); Person person = mapper.readValue(jsonStr, Person.class); ``` 这样就可以得到一个Person对象,其中包含了解析后的JSON数据。 如果我们想要使用递归循环来解析JSON,可以定义一个通用的方法来处理各种类型的JSON数据: ```java public static void parseJson(JsonNode node) { Iterator<String> fieldNames = node.fieldNames(); while (fieldNames.hasNext()) { String fieldName = fieldNames.next(); JsonNode fieldValue = node.get(fieldName); if (fieldValue.isObject()) { parseJson(fieldValue); } else if (fieldValue.isArray()) { for (JsonNode arrayNode : fieldValue) { parseJson(arrayNode); } } else { System.out.println(fieldName + ": " + fieldValue.asText()); } } } ``` 然后使用方法来解析JSON: ```java ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(jsonStr); parseJson(rootNode); ``` 这样就可以递归循环地解析JSON了。当遇到对象或数组时,继续递归调用parseJson方法;当遇到基本类型时,直接输出该字段的名称和值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值