此问题延伸this question。
如果您只有几个字段,之前的解决方案效果很好,那么当您拥有十几个字段时,它就变得无法维护。现在,我当前的设置使用完整的数据绑定,所以我有一个POJO,Jackson将使用它来自动反序列化JSON。
但是,和以前一样,某些字段具有需要传递的约束。基本上,我正在寻找类似于this的答案,但不需要设置任何属性。只是一个自定义反序列化器,它将充当过滤器,并在字段不符合约束时抛出自定义异常。如果过滤器结束时没有抛出任何异常,Jackson应自动将JSON绑定到POJO。
答案 0 :(得分:5)
似乎Json Schema可能符合您的需求。它允许json字符串的灵活(和复杂)验证规则在反序列化之前。它包括必填字段,基于正则表达式的值检查,行业标准格式(例如,您可以将字段定义为"电子邮件"格式),跨字段依赖项(在最新的v4中)等
以上是与语言无关的标准。至于Java实现,我使用了this one,它支持最新的json模式版本(标准仍在不断发展)。验证器的初始集成是很多工作,(因为我非常动态的json模型)但是之后引入新的验证规则非常方便(只需要更改json模式文件)
答案 1 :(得分:5)
我建议相应地使用Jackson和Hibernate Vaildator来分离反序列化和验证的问题。我们的想法是首先将json数据反序列化为POJO,然后根据需求验证POJO。在您的情况下,您可以应用Class level constraints进行验证。类级别约束具有很大的灵活性,可以通过访问对象实例来验证多个相关属性。它简单而有力。
通常验证需要更高层次的关注。在反序列化之后处理这个问题会更好。这样做可以使代码更容易管理和重用POJO和验证规则。
答案 2 :(得分:2)
只是考虑:如果您在反序列化期间不关心验证,请为您的POJO类尝试 if(FBSDKAccessToken.currentAccessToken().hasGranted("user_friends")){
let request : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "/me/friends", parameters: nil,HTTPMethod: "GET")
request.startWithCompletionHandler({ (connection, result, error) -> Void in
if((error == nil)){
print(result)
}else{
print(error)
}
})
}else{
print("Publish action permission not granted")
}
注释。您可以稍后在实际业务逻辑与pojo类一起使用时进行验证。