【问题标题】:Jackson json : traversing a json tree node by nodeJackson json:逐节点遍历json树
【发布时间】:2012-04-26 02:24:35
【问题描述】:

我有许多包含 json 数据的文本文件,我在 Jackson json 解析器中使用新的 ObjectMapper().readTree() 方法将 json 数据解析为 DOM 树。

假设现在我有两个 DOM 树 - t1 和 t2。每棵树都会有很多子节点,而子节点又会有很多子节点。

我想做的是逐个节点遍历树 t1 并将 t1 中的每个节点与 t2 中的每个节点进行比较。 我知道 Jackson json 解析器允许我查询特定节点,但是如何逐个节点遍历整个树节点?

【问题讨论】:

    标签: java json jackson tree-traversal


    【解决方案1】:
     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;
     }
    

    这是一个递归的、如此庞大的或深度嵌套的文档可能会出现问题,但这在正常情况下应该可以正常工作。

    【讨论】:

    • 我的 json 文档嵌套得很深。但是,我将尝试您在上面给出的功能,并根据我认为合适的方式进行更改。您有什么可以提出的建议/改进(如果文档嵌套很深)谢谢
    • 除非嵌套深度达到数千,否则应该没问题。在这种情况下,您可能会遇到 VM 堆栈大小的问题,但是,我怀疑您首先会遇到与 TreeMapper 相同的问题。如果你这样做,那么你可以使用非递归实现,但这些有点冗长。请参阅 [此] (stackoverflow.com/questions/1294701/…) 以开始使用。
    • Staxman 可能是对的,请参阅 JSONNode ObjectNode subclass 源代码(相当于从第 533 行开始实施),看看这是否适合您。
    【解决方案2】:

    您可以简单地使用JsonNode.iterator() 方法获取节点的所有子节点(达到您需要的级别)。您可以检查节点是否为 JsonNode.isArrayJsonNode.isObject 或任何其他类型,以停止深度优先搜索。您需要的其他一切都与trees traversal 相关。

    【讨论】:

    • 是的。我可以使用 JsonNode.iterator() 来做到这一点。但我需要节点下的整个子树(包括子节点下的任何子树),这就是为什么我应该使用 gbegley 建议的递归函数。谢谢!
    【解决方案3】:

    如果你只是想比较t1和t2,你可以写成t1.equals(t2)这样简单。我假设 t1 和 t2 是 JsonNode 类型,它实现了 equals 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多