我正在尝试捕获重复的POJO属性,或者Map键已经过了我的WebService.
因此,例如,如果field1出现两次或者map键1出现两次,我想抛出一个错误:
{
"field1" : 1,
"field1" : 2,
"map" : {
"1" : {
"fieldA" : "null",
"fieldB" : "2"
},
"1" : {
"fieldX" : "null",
"fieldY" : "2"
}
}
}
Run Code Online (Sandbox Code Playgroud)
var*_*ren 24
可以使用 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)
结果是:
com.fasterxml.jackson.core.JsonParseException: Duplicate field 'field1'
Run Code Online (Sandbox Code Playgroud)
如何使用Jackson验证重复属性?发布一下DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY
看看这个讨论:http://jackson-users.ning.com/forum/topics/detecting-duplicate-field
以下是Map类的示例代码:
public class JacksonDuplicates {
private static final String JSON = "{\n" +
" \"field1\" : 1,\n" +
" \"field1\" : 2,\n" +
" \"map\" : {\n" +
" \"1\" : {\n" +
" \"fieldA\" : \"null\",\n" +
" \"fieldB\" : \"2\"\n" +
" },\n" +
" \"1\" : {\n" +
" \"fieldX\" : \"null\",\n" +
" \"fieldY\" : \"2\"\n" +
" }\n" +
" }\n" +
"}";
private static class SingleKeyHashMap<K, V> extends HashMap<K, V> {
@Override
public V put(K key, V value) {
if (containsKey(key)) {
throw new IllegalArgumentException("duplicate key " + key);
}
return super.put(key, value);
}
}
public static void main(String[] args) throws IOException {
SimpleModule module = new SimpleModule();
module.addAbstractTypeMapping(Map.class, SingleKeyHashMap.class);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
mapper.readValue(JSON, Map.class);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Exception in thread "main" java.lang.IllegalArgumentException: duplicate key field1
at jackson.JacksonDuplicates$SingleKeyHashMap.put(JacksonDuplicates.java:38)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer._readAndBindStringMap(MapDeserializer.java:434)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:312)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:26)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2098)
at jackson.JacksonDuplicates.main(JacksonDuplicates.java:50)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5705 次 |
| 最近记录: |