江苏建站,东莞门户网站建设方案,免费下载一个app,小米品牌vi设计背景
最近使用json实现复杂业务配置, 因为功能需要解析读取json的中节点数据。如果使用循环或者stream处理#xff0c;可以实现#xff0c;但是都过于麻烦。在想能否使用更简单json读取方式#xff0c;正好发现fastjson支持该功能#xff0c;本文做一个记录
案例说明
示…背景
最近使用json实现复杂业务配置, 因为功能需要解析读取json的中节点数据。如果使用循环或者stream处理可以实现但是都过于麻烦。在想能否使用更简单json读取方式正好发现fastjson支持该功能本文做一个记录
案例说明
示例1使用fastjson实现,依赖如下 !--alibaba.json和依赖包--dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.79/version/dependency为了对比写法便捷性示例2也提供jackson的部分实现方式。
示例1. fastjson实现json指定节点按条件过滤提取数据
使用 JSONPath.eval 来筛选 JSON 数据中符合特定条件的元素。以下是使用 eval 方法提取 author 等于 “Nigel Rees” 的那条记录的示例代码
public class JSONPathExample {public static void main(String[] args) {String json {\n \store\: {\n \book\: [\n { \category\: \reference\, \author\: \Nigel Rees\, \title\: \Sayings of the Century\, \price\: 8.95 },\n { \category\: \fiction\, \author\: \Evelyn Waugh\, \title\: \Sword of Honour\, \price\: 12.99 },\n { \category\: \fiction\, \author\: \Herman Melville\, \title\: \Moby Dick\, \price\: 8.99 },\n { \category\: \fiction\, \author\: \J. R. R. Tolkien\, \title\: \The Lord of the Rings\, \price\: 22.99 }\n ],\n \bicycle\: {\n \color\: \red\,\n \price\: 19.95\n }\n }\n };JSONObject jsonObject JSON.parseObject(json);JSONArray result (JSONArray) JSONPath.eval(jsonObject, $.store.book[?(.author Nigel Rees)]);for (Object book : result) {System.out.println(book);}}
}
运行结果如下符合预期。而且代码非常简洁。
{author:Nigel Rees,price:8.95,category:reference,title:Sayings of the Century}示例2. jackson实现json指定节点按条件过滤提取数据
jackson 不支持直接使用 JSONPath 表达式但可以通过结合 Jackson 和 Java 流操作实现类似的功能。以下是一个使用 Jackson 过滤 JSON 数据中 type 为 ‘AggregateRoot’ 的节点的示例
public class JacksonExample {public static void main(String[] args) throws IOException {String json {\n \classDiagram\: {\n \nodes\: [\n { \id\: \1\, \type\: \AggregateRoot\, \name\: \Node1\ },\n { \id\: \2\, \type\: \Entity\, \name\: \Node2\ },\n { \id\: \3\, \type\: \AggregateRoot\, \name\: \Node3\ },\n { \id\: \4\, \type\: \ValueObject\, \name\: \Node4\ }\n ]\n }\n };ObjectMapper objectMapper new ObjectMapper();JsonNode rootNode objectMapper.readTree(json);JsonNode nodesNode rootNode.path(classDiagram).path(nodes);ListMapString, Object nodes new ArrayList();if (nodesNode.isArray()) {nodes StreamSupport.stream(nodesNode.spliterator(), false).filter(node - AggregateRoot.equals(node.path(type).asText())).map(node - objectMapper.convertValue(node, Map.class)).collect(Collectors.toList());}for (MapString, Object node : nodes) {System.out.println(node);}}
}总结
fastjson的JSONPath.eval方法对于快速解析json数据十分便利后续再记录更多的使用技巧。