Джексон json: обход узла дерева json за узлом

У меня есть множество текстовых файлов, содержащих данные json, и я использую новый метод ObjectMapper (). ReadTree () в парсере Jackson json для синтаксического анализа данных json в деревьях DOM.

Скажем, теперь у меня есть два дерева DOM - t1 и t2. У каждого дерева будет много дочерних узлов, которые, в свою очередь, будут иметь много дочерних узлов.

Я бы хотел пройти по дереву t1 узел за узлом и сравнить каждый узел в t1 с каждым узлом в t2. Я знаю, что парсер Jackson json позволяет мне запрашивать определенные узлы, но как мне пройти по узлу целого дерева за узлом?


person athreya86    schedule 13.04.2012    source источник


Ответы (3)


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

person Eugene Retunsky    schedule 13.04.2012
comment
да. Для этого я мог бы использовать JsonNode.iterator (). Но мне нужно все поддерево под узлом (включая любое поддерево под дочерним узлом), поэтому я должен использовать рекурсивную функцию, предложенную gbegley. Спасибо! - person athreya86; 14.04.2012
comment
Как насчет примера? - person k-den; 26.06.2017

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

person wanghq    schedule 13.04.2012

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

Это рекурсивный процесс, поэтому у массивных или глубоко вложенных документов могут быть проблемы, но в обычных случаях это должно работать нормально.

person gbegley    schedule 13.04.2012
comment
мой документ json глубоко вложен. Но я собираюсь попробовать функцию, которую вы указали выше, и внести изменения по своему усмотрению. Есть ли у вас какие-либо предложения / улучшения (если документ глубоко вложен) Спасибо - person athreya86; 14.04.2012
comment
С вами все должно быть в порядке, если ваша глубина вложенности не исчисляется тысячами. В этом случае вы можете столкнуться с проблемами с размером стека виртуальной машины, однако я подозреваю, что вы сначала столкнетесь с теми же проблемами с TreeMapper. Если вы это сделаете, вы можете использовать нерекурсивную реализацию, но это немного более подробно. См. [Это] (stackoverflow.com/questions/1294701/), чтобы начать. - person gbegley; 16.04.2012
comment
Стаксман может быть прав, см. подкласс JSONNode ObjectNode (соответствует началу реализации в строке 533), чтобы узнать, может ли это сработать для вас. - person gbegley; 16.04.2012