我有很多包含json數據的文本文件,我在Jackson json解析器中使用新的ObjectMapper()。readTree()方法將json數據解析爲DOM樹。傑克遜json:遍歷節點的json樹節點
假設我現在有兩棵DOM樹 - t1和t2。每棵樹都會有許多子節點,而這些節點又會有許多子節點。
我想要做的是逐個遍歷樹t1,並將t1中的每個節點與t2中的每個節點進行比較。 我知道Jackson json解析器允許我查詢特定節點,但是如何遍歷整個樹節點?
我有很多包含json數據的文本文件,我在Jackson json解析器中使用新的ObjectMapper()。readTree()方法將json數據解析爲DOM樹。傑克遜json:遍歷節點的json樹節點
假設我現在有兩棵DOM樹 - t1和t2。每棵樹都會有許多子節點,而這些節點又會有許多子節點。
我想要做的是逐個遍歷樹t1,並將t1中的每個節點與t2中的每個節點進行比較。 我知道Jackson json解析器允許我查詢特定節點,但是如何遍歷整個樹節點?
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;
}
這是一個遞歸,如此大量的,或深嵌套文件可能有問題,但是這應該工作正常的情況下正常。
您可以簡單地使用JsonNode.iterator()
方法來獲取節點的所有子節點(到您需要的級別)。您可以檢查節點JsonNode.isArray
或JsonNode.isObject
或任何其他類型以停止深度優先搜索。您需要的一切只與trees traversal有關。
是的。我可以使用JsonNode.iterator()來做到這一點..但我需要節點下的整個子樹(包括子節點下的任何子樹),這就是爲什麼我應該使用gbegley提出的遞歸函數。謝謝! – athreya86 2012-04-14 16:27:42
示例如何? – 2017-06-26 03:22:59
如果你只是想比較t1和t2,你可以寫成像t1.equals(t2)一樣簡單。我假設t1和t2是已經實現了equals方法的JsonNode類型。
我的JSON文檔是深深嵌套的。但是,我將嘗試您上面給出的功能,並根據需要進行更改。你有任何建議/可以做出改進(如果文檔深深嵌套)謝謝 – athreya86 2012-04-14 16:28:56
JsonNode實現了equals() - 因此代碼示例有點多餘... – StaxMan 2012-04-16 02:14:21
你應該沒問題,除非你的嵌套深度進入數千人。在這種情況下,您可能會遇到VM堆棧大小的問題,但是,我懷疑您會首先遇到與TreeMapper相同的問題。如果你這樣做,那麼你可以使用非遞歸實現,但這些更加冗長。請參閱[本](http://stackoverflow.com/questions/1294701/post-order-traversal-of-binary-tree-without-recursion)開始。 – gbegley 2012-04-16 18:42:41