设置 @JsonIgnoreProperties(ignoreUnknown = true) 时,有没有办法检测未映射的 json 属性?

Posted

技术标签:

【中文标题】设置 @JsonIgnoreProperties(ignoreUnknown = true) 时,有没有办法检测未映射的 json 属性?【英文标题】:Is there a way to detect unmapped json properties when @JsonIgnoreProperties(ignoreUnknown = true) is set? 【发布时间】:2018-09-26 10:26:18 【问题描述】:

我需要在 PUT 或 POST 请求后检测哪些 json 字段未映射到数据模型。 例如: 如果我发布这个:


 "firstName": "test",
 "lastName": "test 2",
 "age": 25

我的模型只有名字和姓氏,我想列出所有未映射的字段,在本例中为“年龄”字段。

【问题讨论】:

【参考方案1】:

如果只是了解哪些属性未映射,您可能需要考虑使用此库:https://github.com/whiskeysierra/jackson-module-unknown-property 它记录所有映射类的未映射属性,而无需修改类本身。

【讨论】:

谢谢。这正是我一直在寻找的,尽管 Nikolay 的回答完成了这项工作。【参考方案2】:

是的,这可以使用 Jackson 的注解 @JsonAnySetter

@JsonIgnoreProperties(ignoreUnknown = true)
public class DTO 
    private String first;
    private String last;
    private Map<String, Object> unknown = new HashMap<>();

    // getters/setters omitted

    @JsonAnySetter
    public void set(String name, Object value) 
        unknown.put(name, value);
    

    public Map<String, Object> getUnknown() 
        return unknown;
    

简单测试:

@Test
public void testUnknown() throws Exception 
    String json = "\"first\":\"John\", \"last\":\"Doe\", \"age\":\"29\"";
    DTO dto = new ObjectMapper().readValue(json, DTO.class);
    assertEquals(1, dto.getUnknown().size());
    assertEquals("29", dto.getUnknown().get("age"));

【讨论】:

以上是关于设置 @JsonIgnoreProperties(ignoreUnknown = true) 时,有没有办法检测未映射的 json 属性?的主要内容,如果未能解决你的问题,请参考以下文章

@JsonIgnore 和 @JsonIgnoreProperties 有啥区别

@JsonProperty @JsonIgnoreProperties

@JsonIgnoreProperties转换实体时忽略json中不存在的字段

SpringBoot @JsonIgnoreProperties、@JsonIgnore、@JsonFormat注解的简单使用

@JsonIgnoreProperties转换实体时忽略json中不存在的字段

@JsonIgnoreProperties注解不起作用的问题解决