直接用@JsonProperty setter处理嵌套数组更高效:标注在方法上接收Map,取phone键并判空;类型不固定时用@JsonTypeInfo多态解析,避免过早自定义Deserializer。

遇到嵌套对象当数组用,setPhoneListFromNested 比建中间类更直接
当你看到 JSON 里是 {"phoneList": {"phone": [...]}},但 Java 模型只想定义 List<Phone> 字段,就别硬套结构建 PhoneList 类了。Jackson 不强制你“照着 JSON 写 POJO”,它允许你用私有 @JsonProperty setter 接收原始解析结果。
关键点:
-
@JsonProperty("phoneList")必须标注在方法上,且方法参数类型为Map<String, Object>或更精确的Map<String, List<Phone>> - 方法体内手动取
map.get("phone"),并做非空判断——phoneListMap可能为null,也可能不含"phone"键 - 这个 setter 是反序列化专用的,不影响序列化逻辑;标准的
getPhoneList()/setPhoneList(...)仍需保留,否则序列化时会丢字段 - 内部
Phone类必须有无参构造器,且字段名与 JSON 中一致(或配@JsonProperty)
ObjectMapper 配置不对,Unexpected character 错误根本绕不开
如果 JSON 里某个字段值本身是转义后的 JSON 字符串(比如 "errorMessage": "{\"status\":400,\"message\":\"Bad Request\"}"),Jackson 默认会把它当对象解析,一读到 { 就报 Unexpected character ('t' (code 116))。
解决路径很明确:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 目标字段类型必须声明为
String,不是ErrorResponse或其他 POJO - 禁用 Jackson 对该字段的自动嵌套解析——靠类型声明本身就能做到,不需要额外注解
- 后续如需二次解析,用另一个
ObjectMapper实例调readValue(errormessage, ErrorResponse.class) - 若整个输入流都含大量单引号、未闭合字段等非标内容,初始化
ObjectMapper时要开这些:ALLOW_SINGLE_QUOTES、ALLOW_UNQUOTED_FIELD_NAMES、ALLOW_UNQUOTED_CONTROL_CHARS
真要写自定义 JsonDeserializer?先确认是否真的绕不开
90% 的“复杂嵌套”场景,用 @JsonProperty setter 或配置 ObjectMapper 就够了。只有当你要统一处理一类字段(比如所有叫 data 的字段都可能是对象或数组)、或需要深度控制反序列化流程(如字段值缺失时 fallback 到默认对象),才值得写 JsonDeserializer 子类。
写之前务必检查:
- 是否已尝试过
@JsonCreator+ 全参构造器?它比自定义 deserializer 更轻量,也更适合字段映射逻辑固定的场景 - 是否漏了
@JsonAlias?大小写不一致、字段名带下划线等,常被误判为“结构复杂” - 是否启用了
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES?关掉它,能快速暴露是字段名不匹配,还是结构真复杂 - 自定义
JsonDeserializer必须注册到SimpleModule,再registerModule到ObjectMapper,漏一步就无效
嵌套层级深、类型动态变?@JsonTypeInfo 和 @JsonSubTypes 才是正解
当 JSON 中某个字段的值类型不固定(比如 "type": "user" 对应 User,"type": "admin" 对应 Admin),别用手动 instanceof 判断。Jackson 原生支持多态反序列化。
核心组合:
-
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")放在父类或字段上,告诉 Jackson 看哪个字段识别类型 -
@JsonSubTypes({@Type(value = User.class, name = "user"), @Type(value = Admin.class, name = "admin")})明确映射关系 - 子类必须是标准 POJO(无参构造器 + getter/setter),不能是 record(除非显式配
@JsonCreator) - 如果 type 字段不在顶层对象里,而在嵌套对象中(比如
{"meta": {"type": "user"}}),就得用@JsonTypeInfo配合@JsonTypeIdResolver自定义解析逻辑,这时才真正进入高阶范畴

















