迫使Jackson反序列化为特定的原始类型

Ped*_*ers 14 java json jackson

我使用Jackson 1.8.3将以下域对象序列化和反序列化为JSON

public class Node {
    private String key;
    private Object value;
    private List<Node> children = new ArrayList<Node>();
    /* getters and setters omitted for brevity */
}
Run Code Online (Sandbox Code Playgroud)

然后使用以下代码对对象进行序列化和反序列化

ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(destination, rootNode);
Run Code Online (Sandbox Code Playgroud)

然后用反序列化反序列化

mapper.readValue(destination, Node.class);
Run Code Online (Sandbox Code Playgroud)

对象的原始值是字符串,双打,长整数或布尔值.但是,在序列化和反序列化期间,Jackson将Long值(例如4)转换为Integers.

我如何"强制"杰克逊将数字非十进制值反序列化为Long而不是Integer?

Fab*_*nge 26

杰克逊2.6中有一个新功能专门用于此案例:

配置要使用的ObjectMapper DeserializationFeature.USE_LONG_FOR_INTS

请参阅https://github.com/FasterXML/jackson-databind/issues/504

cowtowncoder在2015年5月19日推出了一个关闭此问题的提交修复#504和#797


Sta*_*Man 10

如果type声明为java.lang.Object,则Jackson使用"自然"映射,如果值适合32位,则使用Integer.除了自定义处理程序之外,您还必须强制包含类型信息(通过在field/getter旁边添加@JsonTypeInfo;或者通过启用所谓的"默认类型").

  • 虽然这在理论上可能是正确的,但在实践中并不常见.大多数Java应用程序不使用BigInteger,大多数Java应用程序都使用Long作为数字ID.这意味着每当你经历一个无类型的情况(比如一个Map)时,你需要编写像`((Number)map.get("key")).longValue()`这样的代码.如果您担心空值检查,则代码更加繁琐.我在jackson数据绑定git repo中打开了一个功能请求. (6认同)
  • 这不是很令人满意的行为。这意味着,每当您反序列化无类型数字时,都将始终必须强制转换它并调用longValue()或intValue()。如果杰克逊有办法将所有数字强加给朗,那将是很好的。至少行为是可以预测的。 (4认同)