java - Jackson 1.8.5 的日期解析问题

标签 java json date jackson

最近(在过去几个小时左右)我开始收到这个异常堆栈:

org.codehaus.jackson.JsonParseException: Numeric value (1316835995324) out of range of int
 at [Source: java.io.StringReader@5b082d45; line: 1, column: 642]
    at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1291)
    at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:385)
    at org.codehaus.jackson.impl.JsonNumericParserBase.convertNumberToInt(JsonNumericParserBase.java:462)
    at org.codehaus.jackson.impl.JsonNumericParserBase.getIntValue(JsonNumericParserBase.java:257)
    at org.codehaus.jackson.map.deser.StdDeserializer._parseInteger(StdDeserializer.java:237)
    at org.codehaus.jackson.map.deser.StdDeserializer$IntegerDeserializer.deserialize(StdDeserializer.java:838)
    at org.codehaus.jackson.map.deser.StdDeserializer$IntegerDeserializer.deserialize(StdDeserializer.java:825)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:356)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:120)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:97)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:499)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:499)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:120)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:97)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:499)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:499)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:120)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:97)
    at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
    at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:252)
    at org.codehaus.jackson.map.deser.SettableBeanProperty$FieldProperty.deserializeAndSet(SettableBeanProperty.java:499)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:494)
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:350)
    at org.codehaus.jackson.map.ObjectReader._bindAndClose(ObjectReader.java:477)
    at org.codehaus.jackson.map.ObjectReader.readValue(ObjectReader.java:253)

这是在反序列化 java.util.Date 时发生的。有趣的是,在此之前的输入流中还有其他类似的 Date,它们不会导致任何问题。此外,我没有更改正在序列化和反序列化的对象的字段。

有谁知道为什么 Jackson 试图将这个特定的 Date 值反序列化为 int(而不是 long)?

提前感谢您的任何见解。

编辑:我稍微调试了一下,看起来这是 Jackson 试图处理的第一个 Date,尽管它仍然出现在流的后面。我还看到 Jackson 正试图将此数字强制转换为 int,即使在处理的早期它被正确检测为 long

编辑 2:我对此进行了更多调试并发现以下内容:只要我没有采用输入参数的 setter ,序列化/反序列化就可以正常工作,如下所示:

public void setSomeValue(int param)
{
    // stuff
    this.date = <result_value>
}

在我引入这个 setter 的那一刻,Jackson 执行了不同的代码路径并在它试图放置一个 long 的 block 中结束(java.util.Date ) 转换为 int

编辑 3:将 setter 名称更改为与字段名称无关的名称可以解决该问题。我仍然更想知道原始方法是否按预期工作(如果是,其背后的想法是什么)或错误。

最佳答案

对——预期的类型由具有最高优先级的增变器决定。因此,由于您的 setter 声明类型是“int”,这就是 Jackson 对待它的方式。它实际上必须,因为它会调用那个 setter;因此,即使您碰巧有一个不同类型的字段(或返回 Date 的 getter),它也无济于事,因为您不能将 Date 作为“int”传递给 set 方法。

INT_MIN int 类型变量的最小值。 –2147483648

INT_MAX int 类型变量的最大值。 2147483647

关于java - Jackson 1.8.5 的日期解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7535779/

相关文章:

.net - 获取两个日期之间的日历天数

java - 获取与本地计算机不同的时区区域设置

sql - 无法从表格中获取正确的日期

java - 从 Json 到 Gson 的数据模型映射返回 null

java - 如果 jvm gc 一个未关闭的套接字实例,底层的 tcp 连接会发生什么?

android - org.json.JSONObject 无法转换为 com.parse.ParseGeoPoint

python - 网络抓取 - 从网站获取 key

java - 实现接口(interface)不起作用

java - 对单个线程使用 sleep()

php - 循环遍历以 JSON 编码的 PHP 数组