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

