jackson 默认将json值映射为java基础类型或其包装类,具体取决于json结构和目标泛型声明;解析map时value按规则映射为string、integer/long/biginteger、double/bigdecimal、boolean、null、linkedhashmap或arraylist,泛型擦除导致无法自动转为pojo,需typereference显式指定类型。

Jackson 默认将 JSON 中的值映射为 Java 基础类型或其包装类,具体类型取决于 JSON 值的结构和目标泛型声明。当解析 Map<string object></string>(注意:Java 泛型中不能写 Map<string></string>,应为 Map<string></string> 或具体值类型),Jackson 实际不会“知道”你想要什么类型,而是按默认规则推断值的运行时类型。
JSON 值到 Java 类型的默认映射规则
Jackson 使用 ObjectMapper 的默认类型推断机制,对未明确指定反序列化类型的 Map<string object></string>,其 value 会按如下方式映射:
-
JSON string →
String -
JSON number(无小数点) →
Integer(若在 int 范围内),否则Long或BigInteger -
JSON number(含小数点) →
Double(默认),也可配置为BigDecimal -
JSON true/false →
Boolean -
JSON null →
null -
JSON object →
LinkedHashMap<string object></string>(非你定义的 POJO,除非启用 `DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY` 等配合) -
JSON array →
ArrayList<object></object>
泛型擦除导致的类型丢失问题
Java 泛型在运行时被擦除,Map<string user></string> 在反序列化时如果没有额外类型信息,Jackson 仍会把 value 当作 Object 处理,并用默认规则填充——不会自动转成 User。要正确映射为指定类型,必须显式传入类型描述:
- 使用
new TypeReference<map user>>() {}</map>配合objectMapper.readValue(json, typeRef) - 或用
objectMapper.readValue(json, objectMapper.getTypeFactory().constructMapType(HashMap.class, String.class, User.class))
控制数值精度与类型策略
默认用 Double 表示浮点数可能丢失精度,整数也可能因溢出变成 Long。可通过配置改变行为:
- 启用
DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS→ 所有数字都转BigDecimal - 启用
DeserializationFeature.USE_LONG_FOR_INTS→ 整数统一用Long - 禁用
DeserializationFeature.USE_BIG_INTEGER_FOR_INTS(默认开启)→ 避免小整数变BigInteger
嵌套结构的实际类型表现
当 JSON value 是对象或数组,且你声明的是 Map<string object></string>,Jackson 不会尝试匹配你的某个 POJO 类,而是构建通用容器:
-
{"name":"Alice","age":30}→ value 是LinkedHashMap<string object></string>,其中"age"对应Integer -
{"users":[{"id":1},{"id":2}]}→"users"对应ArrayList<linkedhashmap>></linkedhashmap> - 若需强类型,必须为嵌套结构单独指定类型,例如用
@JsonUnwrapped、自定义JsonDeserializer,或改用带明确泛型的Map<string user></string>并传入TypeReference
不复杂但容易忽略:类型映射不是靠变量声明自动生效,而是靠 Jackson 在反序列化时是否拿到足够类型信息。泛型擦除 + 默认推断 = 运行时常见 LinkedHashMap 和 ArrayList,而非你期望的 POJO。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











