使用 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/