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

Jackson反序列化时如何识别空字符串作为key的JSON字段

问题原因

Jackson默认反序列化逻辑中,如果你没有配置字段可见性规则,private字段没有对应的公开setter时会被跳过赋值;同时低版本Jackson默认会过滤空字符串键名的属性映射,导致@JsonProperty("")注解不生效。

可行解决方案

方案1:配置ObjectMapper规则(推荐,无侵入)

按如下配置调整ObjectMapper参数,搭配原有的@JsonProperty("")注解即可生效:

ObjectMapper objectMapper = new ObjectMapper();
// 允许Jackson访问私有字段,不需要额外提供public setter
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
// 关闭未知属性报错,避免空字符串键被判定为未知属性抛出异常
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

如果你使用Spring Boot项目,可以直接在配置文件中添加全局配置:

spring:
  jackson:
    visibility:
      field: any
    deserialization:
      fail-on-unknown-properties: false

测试验证代码:

// 实体类保持原有写法即可
public class DemoEntity {
    @JsonProperty("")
    private String string;

    public String getString() {
        return string;
    }
}

// 反序列化测试
String json = "{\"\": \"hello\"}";
DemoEntity demo = objectMapper.readValue(json, DemoEntity.class);
System.out.println(demo.getString()); // 输出结果为hello

方案2:通过@JsonAnySetter手动映射(兼容性最高)

如果Jackson版本较低或者方案1不生效,可以使用通用未知属性捕获的方式手动赋值,不需要额外配置ObjectMapper:

public class DemoEntity {
    private String string;

    // 捕获所有未明确声明的JSON属性
    @JsonAnySetter
    public void readExtraField(String key, Object value) {
        if ("".equals(key)) {
            this.string = String.valueOf(value);
        }
    }

    public String getString() {
        return string;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:54:04