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

Jackson反序列化:如何将JSON中的null转为字符串"null"?

解决方案

首先要明确:@JsonProperty的defaultValue参数不作用于反序列化过程,它仅用于生成JSON Schema时标注默认值说明,所以你遇到的情况是正常的——Jackson反序列化时遇到JSON中的null,会直接将字段设为null,覆盖你初始化的字符串"null"。

下面提供几种可行的解决方式:

方法一:针对单个字段配置null处理逻辑

给需要处理的字段添加@JsonSetter注解,指定当JSON字段为null时使用字段的初始值:

@Data
class Person {

    @JsonProperty(value = "name")
    @JsonSetter(nulls = Nulls.SET)
    private String name = "null";

    @JsonProperty(value = "surName")
    @JsonSetter(nulls = Nulls.SET)
    private String surName = "null";
}

@JsonSetter(nulls = Nulls.SET)的作用是:当JSON中对应字段为null时,不将字段设为null,而是保留字段的初始值(也就是你定义的"null"字符串)。

方法二:全局配置所有String字段的null处理

如果你的项目中有大量String字段需要将JSON中的null转为字符串"null",可以自定义反序列化器并全局注册:

1. 自定义字符串反序列化器

class StringNullDeserializer extends StdDeserializer<String> {
    protected StringNullDeserializer() {
        super(String.class);
    }

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonNode node = p.getCodec().readTree(p);
        // 遇到null节点时返回字符串"null",否则返回原文本
        return node.isNull() ? "null" : node.asText();
    }
}

2. 注册到ObjectMapper

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(String.class, new StringNullDeserializer());
mapper.registerModule(module);

// 执行反序列化
Person person = mapper.readValue(json, Person.class);

这样所有String类型的字段,在反序列化时遇到JSON中的null,都会被自动转为字符串"null"。

方法三:全局配置保留字段初始值

通过ObjectMapper的全局配置,让Jackson在遇到JSON中的null时,不覆盖字段的初始值:

ObjectMapper mapper = new ObjectMapper();
// 配置所有字段遇到null时使用初始值
mapper.setDefaultSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SET));

// 执行反序列化
Person person = mapper.readValue(json, Person.class);

这个配置会作用于所有字段,只要字段有初始值,反序列化时遇到JSON中的null就会保留初始值,适合你这种字段初始值统一为"null"的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:53:11