这个问题扩展了这个问题。
虽然如果您只有几个字段,以前的解决方案效果很好,但当您有十几个字段时,它变得无法维护。现在,我当前的设置使用完整的数据绑定,所以我有一个 POJO,Jackson 将使用它来自动反序列化 JSON。
但是,和以前一样,某些字段具有需要通过的约束。本质上,我正在寻找与此类似的答案,但无需设置任何属性。只是一个自定义反序列化器,它将充当过滤器并在字段不满足约束时抛出自定义异常。如果过滤器结束时没有抛出异常,Jackson 应该自动将 JSON 绑定到 POJO。
似乎Json Schema可能适合您的需求。它允许在反序列化之前对 json 字符串进行灵活(和复杂)的验证规则。它包括必填字段、基于正则表达式的值检查、行业标准格式(例如,您可以将字段定义为“电子邮件”格式)、跨字段依赖项(在最新 v4 中)等
以上是与语言无关的标准。至于 Java 实现,我使用了支持最新 json 模式版本的这个(标准仍在发展中)。验证器的初始集成工作量很大(因为我的 json 模型非常动态),但之后引入新的验证规则非常方便(只需更改 json 模式文件)
我建议通过相应地使用 Jackson 和Hibernate Vaildator来分离反序列化和验证的关注点。思路是先将json数据反序列化成POJO,然后根据需求对POJO进行校验。在您的情况下,您可以应用类级别约束进行验证。类级约束具有很大的灵活性,可以通过访问对象实例来验证多个相关属性。它简单而强大。
通常验证需要更高级别的关注。最好在反序列化后处理这个问题。这样做可以使代码更容易管理和重用 POJO 和验证规则。
只是要考虑:如果您不关心反序列化期间的验证,请尝试@JsonIgnoreProperties(ignoreUnknown = true)
为您的 POJO 类添加注释。您可以稍后在实际业务逻辑与 pojo 类一起使用时进行验证。