java - 在 Jackson 中跳过错误的 JSON 数据

标签 java json jackson

使用 Jackson 数据绑定(bind),跳过坏数据 block 的最巧妙方法是什么,而不拒绝整个解析

参加这些类(class)(我使用公共(public)字段只是为了使代码简短):

 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 以增量模式使用内容。我正在寻找一个利用数据绑定(bind)的选项。考虑到 ClassWhichCouldFailConstruction 可能要复杂得多,因此编写自定义解析器会很费力。

最佳答案

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

关于java - 在 Jackson 中跳过错误的 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21265081/

相关文章:

java - 重命名 zip 文件中的重复文件 Java

php - 如何在单个数组中显示更多数量的数组结果?

java - 在反序列化过程中将空字符串忽略为 null

android - @JsonCreator 的选择性使用

java - toArray(new String[0]); 中的 new String[0] 有什么用?

java - @JsonTypeName 不起作用并在尝试解析子类型时返回 Missing type id

java - try catch 循环

python - 使用 JSON 功能读取 CSV

Javascript事件序列,pg,postgresql,为什么?

java - 将 json 解析为 Object 时出现 JsonMappingException