如何使用Jackson验证重复属性?

tao*_*ang 8 java json jackson

我正在使用Jackson JSON库将一些JSON对象转换为POJO类.问题是,当我使用具有重复属性的JSON对象时:

{
  "name":"xiaopang",
  "email":"xiaopang1@123.com",
  "email":"xiaopang2@123.com"
}
Run Code Online (Sandbox Code Playgroud)

杰克逊报告最后一封电子邮件"email":"xiaopang2@123.com",然后解析该对象.

我从JSON语法中学到了允许对象中的重复键吗?反序列化具有重复属性的JSON对象时会发生什么情况取决于库实现,抛出错误或使用最后一个重复键.

尽管跟踪所有属性的开销,有没有办法告诉杰克逊在这种情况下报告错误或异常,例如"重复密钥"?

var*_*ren 14

使用 JsonParser.Feature.STRICT_DUPLICATE_DETECTION

ObjectMapper mapper = new ObjectMapper();
mapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);
MyPOJO result = mapper.readValue(json, MyPOJO.class);
Run Code Online (Sandbox Code Playgroud)

结果是:

Exception in thread "main" com.fasterxml.jackson.core.JsonParseException: Duplicate field 'email'
Run Code Online (Sandbox Code Playgroud)

您也可以尝试使用DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY(更多信息)如果您首先将json字符串/输入反序列化为jackson json树,然后再将其反序列化为POJO,则会触发它.可以将它与自定义组合JsonDeserializer如下:

private static class MyPojoDeserializer extends JsonDeserializer<MyPOJO>{

    @Override
    public MyPOJO deserialize(JsonParser p, DeserializationContext ctxt) 
                                                           throws IOException{
        JsonNode tree = p.readValueAsTree();
        return  p.getCodec().treeToValue(tree, MyPOJO.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

设置一次,并像以前一样使用它:

// setup ObjectMapper 
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
SimpleModule module = new SimpleModule();
module.addDeserializer(MyPOJO.class,new MyPojoDeserializer() );
mapper.registerModule(module);

// use
mapper.readValue(json, MyPOJO.class);
Run Code Online (Sandbox Code Playgroud)

结果:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Duplicate field 'email' for ObjectNode: not allowed when FAIL_ON_READING_DUP_TREE_KEY enabled
Run Code Online (Sandbox Code Playgroud)

其他选项是在自定义反序列化器或POJO setter方法中自己实现所有逻辑.