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

Jackson 2.6.0 JsonParser#getCurrentValue() returns null instead of value of JSON property

在Jackson 2.6.0中,JsonParser#getCurrentValue() returns null代替当前解析的值JSON 属性.

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

a
null

但我希望它打印:

a
b

为什么打印的是 null 而不是 b

我怎样才能得到当前JSON属性的值作为一个Object,这样它就会return一个StringBooleanIntegerLongDoubleFloatBigDecimal 等,或 null,视情况而定?

我知道必须有一个算法来确定何时 return,例如,1 作为 IntegerLongDoubleBigDecimal 或其他一些 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);
        }
    }
}

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

首先:getCurrentValue() 根本不是由低级流 API 本身维护的,因此您的代码永远不会看到非空值。相反,它由基于 Java POJO 对象的数据绑定(更高级别)管理,这些对象仅在数据绑定时处理。 方法本身在 JsonParserJsonGenerator 中的原因是由于实际限制,因为 parser/generator 通过处理传递,可用于 JsonSerializer / JsonDeserializer,并且具有分层范围:从概念上讲,此信息将完全属于数据绑定级别。

如果你只想在流层面进行操作,这些方法对你没有用。您需要自己跟踪所有信息。 或者,也许您应该使用 ObjectMapper 将 JSON 绑定为 JsonNode,然后遍历内存中的逻辑树。流式处理最大限度地减少了它保留的状态量,这对于大多数操作来说不一定很方便。