com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: нераспознанное поле «тип» - как я могу получить нет. раз это исключение выбрасывается - PullRequest
0 голосов
/ 14 мая 2018

Я получаю ответ JSON с URL-адреса, в котором указаны имена свойств.В этом случае UnrecognizedPropertyException генерируется вместе с propertyName.Как я отслеживаю имя свойства вместе со счетом времени, когда собственность опечатка.Ниже приведен фрагмент кода:

ObjectMapper objectMapper = new ObjectMapper();
int counter = 0;
JsonContainer[] jc = null;
URL url = new URL("sample_url");
try {
  jc = objectMapper.readValue(url, JsonContainer[].class);
}
catch(UnrecognizedPropertyException e) {
    counter++;
    e.getPropertyName();    
}

Здесь счетчик всегда возвращает 1, хотя имя свойства написано с ошибкой более одного раза.Также, как мне получить имя свойства из сгенерированного исключения

1 Ответ

0 голосов
/ 14 мая 2018

Если вы хотите пропустить неизвестные свойства, но собрать имена и количество отсутствующих свойств, вы можете предоставить собственную реализацию 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

Я оставлю это вамзаписывать и считать неизвестные свойства, а не просто распечатывать их, как в примере выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...