Если вы хотите пропустить неизвестные свойства, но собрать имена и количество отсутствующих свойств, вы можете предоставить собственную реализацию DefaultDeserializationContext
, переопределив метод reportUnknownProperty(...)
Например,
public final class ReportingDeserializationContext extends DefaultDeserializationContext {
private static final long serialVersionUID = 1L;
public ReportingDeserializationContext() {
super(BeanDeserializerFactory.instance, null);
}
private ReportingDeserializationContext(ReportingDeserializationContext src, DeserializationConfig config, JsonParser jp, InjectableValues values) {
super(src, config, jp, values);
}
private ReportingDeserializationContext(ReportingDeserializationContext src, DeserializerFactory factory) {
super(src, factory);
}
@Override
public DefaultDeserializationContext createInstance(DeserializationConfig config, JsonParser jp, InjectableValues values) {
return new ReportingDeserializationContext(this, config, jp, values);
}
@Override
public DefaultDeserializationContext with(DeserializerFactory factory) {
return new ReportingDeserializationContext(this, factory);
}
@Override
public void reportUnknownProperty(Object instanceOrClass, String fieldName, JsonDeserializer<?> deser) throws JsonMappingException {
Class<?> clazz = (instanceOrClass instanceof Class ? (Class<?>) instanceOrClass : instanceOrClass.getClass());
System.out.println("Unknown Property: " + clazz.getName() + "." + fieldName);
}
}
Тест
public class Test {
public int a;
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper(null, null, new ReportingDeserializationContext());
Test jc = objectMapper.readValue("{ \"a\": 10, \"b\": 11, \"c\": 12 }", Test.class);
System.out.println(jc.a);
}
}
Выход
Unknown Property: Test.b
Unknown Property: Test.c
10
Я оставлю это вамзаписывать и считать неизвестные свойства, а не просто распечатывать их, как в примере выше.