I'm trying to catch duplicate POJO properties or Map keys are past to my WebService.
So for instance I want to throw an error if field1
appears twice or map key 1
appears twice:
{
"field1" : 1,
"field1" : 2,
"map" : {
"1" : {
"fieldA" : "null",
"fieldB" : "2"
},
"1" : {
"fieldX" : "null",
"fieldY" : "2"
}
}
}
ObjectMapper is the main actor class of Jackson library. ObjectMapper class ObjectMapper provides functionality for reading and writing JSON, either to and from basic POJOs (Plain Old Java Objects), or to and from a general-purpose JSON Tree Model (JsonNode), as well as related functionality for performing conversions.
ObjectMapper is a completely thread-safe service class, it is meant to be used as singleton across the lifetime of the application. It is also very expensive to create.
Yes, that is safe and recommended.
The simple readValue API of the ObjectMapper is a good entry point. We can use it to parse or deserialize JSON content into a Java object. Also, on the writing side, we can use the writeValue API to serialize any Java object as JSON output.
Can use JsonParser.Feature.STRICT_DUPLICATE_DETECTION
ObjectMapper mapper = new ObjectMapper();
mapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);
MyPOJO result = mapper.readValue(json, MyPOJO.class);
Results in:
com.fasterxml.jackson.core.JsonParseException: Duplicate field 'field1'
How to use Jackson to validate duplicated properties? post about DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY
Have a look at this discussion: http://jackson-users.ning.com/forum/topics/detecting-duplicate-field
Here is an example code that comes out from it for a Map class:
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);
}
}
Output:
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With