2012-04-13 103 views
3

我有很多包含json數據的文本文件,我在Jackson json解析器中使用新的ObjectMapper()。readTree()方法將json數據解析爲DOM樹。傑克遜json:遍歷節點的json樹節點

假設我現在有兩棵DOM樹 - t1和t2。每棵樹都會有許多子節點,而這些節點又會有許多子節點。

我想要做的是逐個遍歷樹t1,並將t1中的每個節點與t2中的每個節點進行比較。 我知道Jackson json解析器允許我查詢特定節點,但是如何遍歷整個樹節點?

回答

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

這是一個遞歸,如此大量的,或深嵌套文件可能有問題,但是這應該工作正常的情況下正常。

+0

我的JSON文檔是深深嵌套的。但是,我將嘗試您上面給出的功能,並根據需要進行更改。你有任何建議/可以做出改進(如果文檔深深嵌套)謝謝 – athreya86 2012-04-14 16:28:56

+1

JsonNode實現了equals() - 因此代碼示例有點多餘... – StaxMan 2012-04-16 02:14:21

+0

你應該沒問題,除非你的嵌套深度進入數千人。在這種情況下,您可能會遇到VM堆棧大小的問題,但是,我懷疑您會首先遇到與TreeMapper相同的問題。如果你這樣做,那麼你可以使用非遞歸實現,但這些更加冗長。請參閱[本](http://stackoverflow.com/questions/1294701/post-order-traversal-of-binary-tree-without-recursion)開始。 – gbegley 2012-04-16 18:42:41

2

您可以簡單地使用JsonNode.iterator()方法來獲取節點的所有子節點(到您需要的級別)。您可以檢查節點JsonNode.isArrayJsonNode.isObject或任何其他類型以停止深度優先搜索。您需要的一切只與trees traversal有關。

+0

是的。我可以使用JsonNode.iterator()來做到這一點..但我需要節點下的整個子樹(包括子節點下的任何子樹),這就是爲什麼我應該使用gbegley提出的遞歸函數。謝謝! – athreya86 2012-04-14 16:27:42

+0

示例如何? – 2017-06-26 03:22:59

2

如果你只是想比較t1和t2,你可以寫成像t1.equals(t2)一樣簡單。我假設t1和t2是已經實現了equals方法的JsonNode類型。