Jackson使用ObjectMapper.readTree反序列化时何时创建ShortNode?
Jackson中ShortNode的创建情况解析
嘿,这个问题问得很到位!我来给你掰扯清楚:Jackson在默认的JSON反序列化流程里,几乎不会自动生成ShortNode实例,你碰到只有IntNode和LongNode的情况完全是正常操作。
为啥默认不会生成ShortNode?
- 首先,JSON规范里根本没有
short这种整数类型,只有一个通用的"number"类型。Jackson解析整数时,默认会根据数值范围选最适配的节点类型:- 数值在Java
int的范围内(-2³¹ 到 2³¹-1)时,就生成IntNode - 数值超出
int但还在long范围内时,就生成LongNode
- 数值在Java
- 核心解析逻辑里压根没给
ShortNode留自动生成的分支——毕竟short的范围完全被int覆盖了,用int处理更高效,犯不着专门搞个ShortNode出来。
那什么时候会出现ShortNode?
只有两种场景能见到它:
- 手动构建JsonNode树:比如你主动调用
JsonNodeFactory.instance.shortNode((short) 123)来创建 - 自定义反序列化器:如果你写了自定义的反序列化逻辑,明确把某个字段解析成
ShortNode
给你业务逻辑的建议
既然你的业务依赖NumericNode.numberValue()的返回类型,这里有两个靠谱的方案:
- 别纠结具体的Number子类,根据业务需求调用
NumericNode的类型转换方法就行,比如shortValue()、intValue()、longValue()——不管底层是IntNode还是LongNode,这些方法都能帮你转成需要的数值类型,稳得很。 - 如果非要统一节点类型,可以自定义
JsonNodeFactory来强制生成特定类型,但这种做法大多没必要,反而会增加复杂度。
内容的提问来源于stack exchange,提问作者Viktor
相关产品推荐
相关产品推荐

