如何使用杰克逊来验证重复的属性?
我正在使用Jackson JSON库将一些JSON对象转换为POJO类。 问题是,当我使用具有重复属性的JSON对象时:
{
"name":"xiaopang",
"email":"xiaopang1@123.com",
"email":"xiaopang2@123.com"
}
杰克逊报告最后一封电子邮件"email":"xiaopang2@123.com"
,然后解析该对象。
我从中学到了JSON语法是否允许在对象中使用重复键? 那么在反序列化具有重复属性的JSON对象时会发生什么情况取决于库实现,它会引发错误或使用最后一个重复键。
尽管追踪所有属性的开销,有没有办法告诉杰克逊在这种情况下报告错误或异常,如“重复键”?
使用JsonParser.Feature.STRICT_DUPLICATE_DETECTION
ObjectMapper mapper = new ObjectMapper();
mapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);
MyPOJO result = mapper.readValue(json, MyPOJO.class);
结果是:
Exception in thread "main" com.fasterxml.jackson.core.JsonParseException: Duplicate field 'email'
您也可以尝试使用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);
}
}
设置一次,然后像以前一样使用它:
// 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);
结果:
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Duplicate field 'email' for ObjectNode: not allowed when FAIL_ON_READING_DUP_TREE_KEY enabled
其他选项是在自定义解串器或POJO setter方法中实现所有逻辑。
链接地址: http://www.djcxy.com/p/37839.html