在 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);
}
}
}
这里有几个不同的事情在起作用。
首先:
getCurrentValue()
根本不是由低级流API本身维护的,因此你的代码永远不会看到非空值。相反,它由基于 Java POJO 对象的数据绑定(更高级别)管理,这些对象仅在数据绑定时处理。
方法本身位于 JsonParser
和 JsonGenerator
中的原因是由于实际限制,因为解析器/生成器经过处理,可用于 JsonSerializer
/ JsonDeserializer
,并且具有层次结构范围:从概念上讲,此信息属于完全数据绑定级别。
如果您只想在流级别上操作,这些方法对您没有用。您需要自己跟踪所有信息。 或者,也许您应该使用
JsonNode
将 JSON 绑定为 ObjectMapper
,然后遍历内存中的逻辑树。流处理最大限度地减少了它保留的状态量,这对于大多数操作来说不一定很方便。