重写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
相关产品推荐
相关产品推荐

