如何全局配置Jackson ObjectMapper以在所有反序列化中使用类型转换器?
解决Jackson全局转换JSON中"null"字符串的问题
针对你遇到的场景——客户端发送的JSON中String类型属性值为"null"时要转为null引用,int类型属性值为"null"时要转为0,这里提供两种全局生效的解决方案:
方案一:为目标类型添加自定义反序列化器(推荐)
你已经实现了String类型的自定义反序列化器,只需再为Integer类型添加对应的反序列化器(Jackson会自动处理int基本类型的适配),将两者放入同一个SimpleModule中注册即可:
@Bean public Module convertNullValueModule() { SimpleModule module = new SimpleModule(); // 处理String类型:"null"转为null引用 module.addDeserializer(String.class, new StdDeserializer<>(String.class) { @Override public String deserialize(JsonParser p, DeserializationContext context) throws IOException { String value = StringDeserializer.instance.deserialize(p, context); return "null".equalsIgnoreCase(value) ? null : value; } }); // 处理Integer/int类型:"null"转为0 module.addDeserializer(Integer.class, new StdDeserializer<>(Integer.class) { @Override public Integer deserialize(JsonParser p, DeserializationContext context) throws IOException { String value = p.getText(); if ("null".equalsIgnoreCase(value)) { return 0; } // 处理非数字字符串的情况,可根据业务调整(比如抛出异常或返回默认值) try { return Integer.parseInt(value); } catch (NumberFormatException e) { return 0; } } }); return module; }
将这个Module注册到你的ObjectMapper后,所有String和int类型的字段都会自动处理"null"字符串的转换。如果还有其他数字类型(如long、double),可以按照同样的方式添加对应类型的反序列化器。
方案二:全局注册类型转换器
如果更倾向于使用Converter机制,你可以直接通过ObjectMapper的addConverter方法注册全局转换器,无需依赖SimpleModule:
1. 定义转换器类
// String转String:将"null"转为null引用 public class StringToNullConverter extends StdConverter<String, String> { @Override public String convert(String value) { return "null".equalsIgnoreCase(value) ? null : value; } } // String转Integer:将"null"转为0 public class StringToZeroConverter extends StdConverter<String, Integer> { @Override public Integer convert(String value) { if ("null".equalsIgnoreCase(value)) { return 0; } try { return Integer.parseInt(value); } catch (NumberFormatException e) { return 0; } } }
2. 配置ObjectMapper并注册转换器
@Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 注册全局转换器 mapper.addConverter(new StringToNullConverter()); mapper.addConverter(new StringToZeroConverter()); // 如需处理其他类型,添加对应的转换器即可 return mapper; }
这种方式的核心是利用Jackson的类型转换机制,当JSON中的字符串值需要转换为目标类型(如String、Integer)时,对应的Converter会自动触发。
内容的提问来源于stack exchange,提问作者Sharon Ben Asher
相关产品推荐
相关产品推荐

