我有许多包含 json 数据的文本文件,我在 Jackson json 解析器中使用新的 ObjectMapper().readTree() 方法将 json 数据解析为 DOM 树。
假设现在我有两个 DOM 树 - t1 和 t2。每棵树都会有很多子节点,而子节点又会有很多子节点。
我想做的是逐个节点遍历树 t1 并将 t1 中的每个节点与 t2 中的每个节点进行比较。我知道 Jackson json 解析器允许我查询特定节点,但是如何逐个节点遍历整个树节点?
我有许多包含 json 数据的文本文件,我在 Jackson json 解析器中使用新的 ObjectMapper().readTree() 方法将 json 数据解析为 DOM 树。
假设现在我有两个 DOM 树 - t1 和 t2。每棵树都会有很多子节点,而子节点又会有很多子节点。
我想做的是逐个节点遍历树 t1 并将 t1 中的每个节点与 t2 中的每个节点进行比较。我知道 Jackson json 解析器允许我查询特定节点,但是如何逐个节点遍历整个树节点?
您可以简单地使用JsonNode.iterator()
方法来获取节点的所有子节点(达到您需要的级别)。您可以检查节点JsonNode.isArray
或JsonNode.isObject
任何其他类型以停止深度优先搜索。您需要的其他一切都与tree traversal相关。
如果只想比较 t1 和 t2,可以写成 t1.equals(t2) 这么简单。我假设 t1 和 t2 是 JsonNode 类型,它实现了 equals 方法。
boolean NodesEqual(JsonNode n1, JsonNode n2) {
if(n1.size()!=n2.size())return false;
// ... other equality checks, like name, data type, etc
for(int i=0;i<n.size();i++){
JsonNode child1 = n1.get(i);
JsonNode child2 = n2.get(i);
if(!NodesEqual(child1,child2)) return false;
}
return true;
}
这是一个递归的、如此庞大或深度嵌套的文档可能会出现问题,但这对于正常情况应该可以正常工作。