有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java跳过Jackson中的错误JSON数据

使用Jackson数据绑定,在不拒绝整个解析的情况下跳过坏数据块的最简洁的方法是什么

以这些类为例(我使用公共字段只是为了使代码简短):

 public class ClassWhichCouldFailConstruction {
     public ClassWhichCouldFailConstruction(String s) {
         if(s.charAt(0) > 'L') {
            throw new BadParameterException();
         }
         // else init code here.
     }
 }

 public class User {
     public String name;
     public ClassWhichCouldFailConstruction failable;
 }

 public class AppInfo {
     public List<User> users;
 }

。。。下面是解析它的代码:

 AppInfo appinfo = (List<User>) objectMapper.readValues(jsonStream, AppInfo.class);

。。。这个JSON:

 { "users": [ 
     { "name": "John", "failable": "Example" },
     { "name": "Jane", "failable": "No good" }
   ]
 }

默认情况下ClassWhichCouldFailConstruction("No good")将抛出一个异常,该异常将冒泡到objectMapper.readValues()的调用方

  • 如何使其返回一个AppInfo对象,该对象包含一个users列表,该列表的长度为一个项目(有效项目)
  • 我可以运行一个例程来处理(例如记录)跳过的条目吗

我知道我可以通过自定义反序列化器实现这一点:

 public class User {
     public String name;
     @JsonDeserialize (using = MyCustomDeserializer.class)
     public ClassWhichCouldFailConstruction failable;
 }

。。。其中MyCustomDeserializer以增量模式使用内容。我正在寻找一个利用数据绑定的选项。考虑到{{CD5}}可能是一个复杂得多的东西,因此编写自定义解析器将是费力的。


共 (1) 个答案

  1. # 1 楼答案

    使用Bean Validation API而不是从构造函数中抛出异常。JSON解析和数据绑定(Jackson所做的)可以与验证逻辑分离。这就是Bean Validator的帮助:您可以声明性地定义规则和约束