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

如何全局配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:05:29