Java com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:未识别字段;类型";-如何获取引发此异常的次数
我正在从一个URL获取JSON响应,这有属性名拼写错误。在本例中,UnrecognizedPropertyException与propertyName一起抛出。如何跟踪属性名称以及属性拼写错误的次数。下面是一段代码: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
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);
}
}