解码杰克逊树模型

时间:2014-09-17 05:33:13

标签: java jackson

 DATA1 = {"metrics": {"code1": 0, "code2" : 100}  }
 DATA2 = {"metrics": {"code1": [10,20,30]}}

CODE
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(m);

JsonNode metric_node = rootNode.path("metrics");
Iterator iterator  = metric_node.getFields();
while (iterator.hasNext()) {
     logger.info("class_name=> {}", iterator.next().getClass().getName());
     logger.info("content=> {}", iterator.next());
}


OUTPUT (for DATA1)
class_name=> java.util.LinkedHashMap$Entry
content=> code1=0
class_name=> java.util.LinkedHashMap$Entry
content=> code2=100

Don't know about DATA2

我无法遍历hashmap。我尝试了iterator.next()。getKey()等但没有工作。我如何

1 个答案:

答案 0 :(得分:1)

您只是迭代正在访问的JsonNode的外键。由于您要打印出实际类的名称,因此您将获得有关LinkedHashMap$Entry的记录输出。看一下metric_node.getFields();

的返回类型
Iterator<Map.Entry<String, JsonNode>> iterator  = metric_node.fields();

您实际上是在该级别上迭代每个节点。但是,因为你两次调用iterator.next(),所以你正在击中两个键并且循环正在终止。如果您尝试在 DATA2 上运行此代码,您将获得NoSuchElementException,因为您正在迭代比迭代器实际知道的更多项目。

因此,您实际上并未查看与这些键关联的任何值。如果您更改循环处理JsonNodes的方式,您将看到每个字段的键/值。如果您有想要通过的嵌套对象,则需要遍历每个JsonNode

JsonNode rootNode = mapper.readTree(DATA1);

JsonNode metric_node = rootNode.path("metrics");
Iterator<Map.Entry<String, JsonNode>> iterator  = metric_node.fields();
while (iterator.hasNext()) {
    Map.Entry<String, JsonNode> next = iterator.next();
    System.out.println("class_name=> = " + next.getKey());
    System.out.println("content=> = " + next.getValue());
    System.out.println();
}

输出:

class_name=> = code1
content=> = 0

class_name=> = code2
content=> = 100