如何获取ObjectMapper readValue方法的未识别字段列表?
获取Jackson反序列化时的未识别字段列表
Jackson的readValue()抛出的IOException多数情况下是**JsonMappingException**(它是IOException的子类),我们可以针对性捕获这个异常来提取未识别字段,不需要开启忽略未知字段或使用JsonAlias:
- 核心思路:直接从
JsonMappingException中提取未识别字段集合,分两种版本适配:- Jackson 2.9及以上版本(推荐):
该版本新增了getUnrecognizedProperties()方法,可直接获取所有未识别字段:ObjectMapper mapper = new ObjectMapper(); try { TargetBean bean = mapper.readValue(jsonContent, TargetBean.class); } catch (JsonMappingException e) { // 直接获取未识别字段集合 Set<String> unrecognizedFields = e.getUnrecognizedProperties(); // 按需处理,比如打印或记录 System.out.println("检测到未识别字段:" + unrecognizedFields); } catch (IOException e) { // 处理其他IO类异常(如文件读取失败等) e.printStackTrace(); } - Jackson 2.9以下版本:
低版本没有直接的方法,可通过遍历异常的路径节点提取:ObjectMapper mapper = new ObjectMapper(); try { TargetBean bean = mapper.readValue(jsonContent, TargetBean.class); } catch (JsonMappingException e) { Set<String> unrecognizedFields = new HashSet<>(); // 遍历异常路径,收集未识别字段 for (JsonMappingException.Reference ref : e.getPath()) { String unrecognizedProp = ref.getUnrecognizedPropertyName(); if (unrecognizedProp != null) { unrecognizedFields.add(unrecognizedProp); } } System.out.println("检测到未识别字段:" + unrecognizedFields); } catch (IOException e) { e.printStackTrace(); }
- Jackson 2.9及以上版本(推荐):
- 注意:Jackson默认开启
FAIL_ON_UNKNOWN_PROPERTIES特性(即遇到未识别字段就抛异常),不需要额外配置,正好符合你不想抑制错误的需求。
内容的提问来源于stack exchange,提问作者Shiv Prakash
相关产品推荐
相关产品推荐

