在Jackson中删除错误的JSON数据

时间:2014-01-21 17:28:01

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

1 个答案:

答案 0 :(得分:0)

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