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一个String
,Boolean
、Integer
、Long
、Double
、Float
、BigDecimal
等,或 null
,视情况而定?
我知道必须有一个算法来确定何时 return,例如,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
中的原因是由于实际限制,因为 parser/generator 通过处理传递,可用于 JsonSerializer
/ JsonDeserializer
,并且具有分层范围:从概念上讲,此信息将完全属于数据绑定级别。
如果你只想在流层面进行操作,这些方法对你没有用。您需要自己跟踪所有信息。
或者,也许您应该使用 ObjectMapper
将 JSON 绑定为 JsonNode
,然后遍历内存中的逻辑树。流式处理最大限度地减少了它保留的状态量,这对于大多数操作来说不一定很方便。
在Jackson 2.6.0中,JsonParser#getCurrentValue()
returns null
代替当前解析的值JSON 属性.
本题末尾的示例方法打印:
a
null
但我希望它打印:
a
b
为什么打印的是 null
而不是 b
?
我怎样才能得到当前JSON属性的值作为一个Object
,这样它就会return一个String
,Boolean
、Integer
、Long
、Double
、Float
、BigDecimal
等,或 null
,视情况而定?
我知道必须有一个算法来确定何时 return,例如,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
中的原因是由于实际限制,因为 parser/generator 通过处理传递,可用于 JsonSerializer
/ JsonDeserializer
,并且具有分层范围:从概念上讲,此信息将完全属于数据绑定级别。
如果你只想在流层面进行操作,这些方法对你没有用。您需要自己跟踪所有信息。
或者,也许您应该使用 ObjectMapper
将 JSON 绑定为 JsonNode
,然后遍历内存中的逻辑树。流式处理最大限度地减少了它保留的状态量,这对于大多数操作来说不一定很方便。