You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重写Jackson默认KeyDeserializer仅作用于顶层键,原因排查

问题原因

你注册的Object.class类型KeyDeserializer仅作用于顶层键,核心原因是:

  • Jackson反序列化嵌套JSON对象时,会自动将其转为LinkedHashMap<String, Object>,这类嵌套Map的键类型是String;
  • Jackson内置了String类型的默认KeyDeserializer,优先级高于你注册的Object.class实现,因此嵌套键不会触发自定义逻辑。
解决方案

要让所有层级的Map键都触发自定义KeyDeserializer,只需将注册目标从Object.class改为String.class(因为所有JSON键最终都会被反序列化为Java中的String类型键):

修改你的ObjectMapper配置代码:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
// 注册针对String类型键的KeyDeserializer,覆盖默认实现
module.addKeyDeserializer(String.class, new MyKeyParser());
mapper.registerModule(module);
Map<String, Object> map = mapper.readValue(jsonString, Map.class);

你的自定义MyKeyParser无需修改,此时运行代码会输出所有层级的键:

upper_key
lower_key
lower_key_2
upper_key_2
补充说明

如果你的实际场景中存在非String类型的键(比如枚举、数字),可以针对对应类型分别注册KeyDeserializer,或者通过SimpleModule.addKeyDeserializer(Class<?> keyClass, KeyDeserializer deser)批量覆盖。这种方式无需遍历Map或自定义整个Map反序列化器,完全符合你“仅通过KeyDeserializer实现键修改”的需求。

内容的提问来源于stack exchange,提问作者Boaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:23:09