Jackson 2.6.0 JsonParser#getCurrentValue() 返回 null 而不是 JSON 属性的值

问题描述 投票:0回答:1

在 Jackson 2.6.0 中,

JsonParser#getCurrentValue()
返回
null
,而不是当前解析的 JSON 属性的值。

本问题末尾的示例方法打印:

a
null

但我希望它打印出来:

a
b

为什么打印的是

null
而不是
b

如何获取当前 JSON 属性的值作为

Object
,以便它将返回
String
Boolean
Integer
Long
Double
Float
BigDecimal 
等,或
null
(视情况而定)?

我知道必须有一个算法来确定何时返回,例如,

1
作为
Integer
Long
Double
BigDecimal
或其他一些
Number
子类,但是我想会有一个默认算法可以被自定义算法替换。

方法示例:

public static void main(final String[] args) throws IOException {
    final JsonParser jsonParser = new JsonFactory().createParser("{\"a\":\"b\"}");

    while (jsonParser.nextValue() != null) {
        final Object value = jsonParser.getCurrentValue();
        final String name  = jsonParser.getCurrentName();
        if (name != null) {
            System.out.println(name + "\n" + value);
        }
    }
}
java jackson jsonparser jackson2 jsonnode
1个回答
1
投票

这里有几个不同的事情在起作用。

首先:

getCurrentValue()
根本不是由低级流API本身维护的,因此你的代码永远不会看到非空值。相反,它由基于 Java POJO 对象的数据绑定(更高级别)管理,这些对象仅在数据绑定时处理。 方法本身位于
JsonParser
JsonGenerator
中的原因是由于实际限制,因为解析器/生成器经过处理,可用于
JsonSerializer
/
JsonDeserializer
,并且具有层次结构范围:从概念上讲,此信息属于完全数据绑定级别。

如果您只想在流级别上操作,这些方法对您没有用。您需要自己跟踪所有信息。 或者,也许您应该使用

JsonNode
将 JSON 绑定为
ObjectMapper
,然后遍历内存中的逻辑树。流处理最大限度地减少了它保留的状态量,这对于大多数操作来说不一定很方便。

© www.soinside.com 2019 - 2024. All rights reserved.