Java com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:未识别字段;类型";-如何获取引发此异常的次数

Java com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:未识别字段;类型";-如何获取引发此异常的次数,java,json,jackson,Java,Json,Jackson,我正在从一个URL获取JSON响应,这有属性名拼写错误。在本例中,UnrecognizedPropertyException与propertyName一起抛出。如何跟踪属性名称以及属性拼写错误的次数。下面是一段代码: ObjectMapper objectMapper = new ObjectMapper(); int counter = 0; JsonContainer[] jc = null; URL url = new URL("sample_url"); try { jc = obj

我正在从一个URL获取JSON响应,这有属性名拼写错误。在本例中,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。另外,如何从抛出的异常中获取属性名如果您想跳过未知属性,但收集缺少的属性的名称和计数,您可以提供自己的实现,覆盖该方法,例如

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);
    }
}
输出

未知属性:Test.b
未知属性:Test.c
10

我将让您记录和计算未知属性,而不是像上面的示例那样打印它们。

当然,计数是1,因为解析器在问题首次出现时抛出异常,这意味着解析在该点停止。未处理剩余的JSON文本。此外,您没有循环,那么为什么您认为
计数器+++
会执行多次呢?
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);
    }
}