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