开发者社区 问答 正文

Jackson JsonNode 的get(i)方法疑惑

String str = "{\"data\":{\"birth_day\":7,\"birth_month\":6},\"errcode\":0,\"msg\":\"ok\",\"ret\":0}";
        ObjectMapper mapper = new ObjectMapper();
        JsonNode root = mapper.readTree(str);
        for (int i = 0; i < root.size() ; i++) {
            System.out.println(root.get(i));
        }
        for (Iterator<?> iter = root.fieldNames();iter.hasNext();){
            System.out.println(iter.next());

输出结果:
// null
// null
// null
// null
// data
// errcode
// msg
// ret
为什么前面输出的结果都是Null?

展开
收起
蛮大人123 2016-02-22 11:39:19 4583 分享 版权
阿里云 AI 助理回答

在您提供的Java代码片段中,使用了Jackson库的ObjectMapper来解析JSON字符串,并通过readTree方法得到一个JsonNode对象。之后,您尝试遍历这个JsonNode对象的字段名称。但是,在进入循环体之前,您错误地放置了一个未闭合的for循环头,这导致了代码逻辑上的误解。

实际上,您的代码中多了一个没有正确配对的for循环初始化和条件判断部分,这使得循环在真正开始遍历root.fieldNames()之前就尝试打印了四次null(每次迭代尝试访问并打印一个不存在的元素)。正确的循环结构应该如下所示:

String str = "{\"data\":{\"birth_day\":7,\"birth_month\":6},\"errcode\":0,\"msg\":\"ok\",\"ret\":0}";
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(str);
Iterator<String> iter = root.fieldNames();
while(iter.hasNext()){
    System.out.println(iter.next());
}

在这个修正后的版本中,我移除了错误的for循环语法,直接使用了while循环来遍历root.fieldNames()返回的迭代器。这样,程序将正确地输出JSON对象的所有字段名,即"data", "errcode", "msg", 和 "ret",而不会先输出任何null值。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: