2012-04-13 1 views
3

У меня есть множество текстовых файлов, содержащих json-данные, и я использую новый метод ObjectMapper(). ReadTree() в парсере Jackson json для анализа данных json для деревьев DOM.Jackson 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

my json doc глубоко вложен. Но я собираюсь попробовать функцию, которую вы указали выше, и внести изменения по своему усмотрению. У вас есть какие-либо предложения/улучшения, которые могут быть сделаны (если документ глубоко вложен) Спасибо – athreya86

+1

JsonNode уже выполняет equals(), поэтому пример кода немного лишний ... – StaxMan

+0

Вы должны быть в порядке, если ваша глубина гнездования не будет тысячи. В этом случае у вас могут возникнуть проблемы с размером стека VM, однако я подозреваю, что вы столкнулись с теми же проблемами с TreeMapper. Если вы это сделаете, вы можете использовать нерекурсивную реализацию, но они немного более подробные. См. [This] (http://stackoverflow.com/questions/1294701/post-order-traversal-of-binary-tree-without-recursion), чтобы начать работу. – gbegley

2

Вы можете использовать метод JsonNode.iterator(), чтобы получить все подузлы узла (до нужного уровня). Вы можете проверить, есть ли узел JsonNode.isArray или JsonNode.isObject или любой другой тип, чтобы остановить глубокий поиск. Все остальное, что вам нужно, просто связано с trees traversal.

+0

Да. Я мог бы использовать JsonNode.iterator() для этого. Но мне нужно все поддерево под узлом (включая любое поддерево под дочерним узлом), поэтому я должен использовать рекурсивную функцию, которую предложил gbegley. Благодаря! – athreya86

+0

Как насчет примера? –

2

Если вы просто хотите сравнить t1 и t2, вы можете написать так же просто, как t1.equals (t2). Я предполагаю, что t1 и t2 - это тип JsonNode, который реализовал метод equals.