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

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

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

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

【问题讨论】:

    标签: json rest spring-boot jackson


    【解决方案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"));
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多