【问题标题】:validate a Java POJO using JSON schema or equivalent?使用 JSON 模式或等价物验证 Java POJO?
【发布时间】:2018-05-29 12:28:28
【问题描述】:

有一种方法或技术,如 JSON 模式,我可以在其中获得数据结构的 JSON 描述,如果符合描述,我可以在 JAVA 中进行验证。 我想要 JSON 模式之类的东西来验证传入的数据,但我想验证 POJO 或 Maps 作为 Java 对象,而不是 JSON 文档本身。

将 POJO 设为 JSON 只是为了验证它不是一个实用的选项,谢谢!

是一种使用 JSON 模式或任何其他技术的方法吗?

更新:摘要 据我所知:JSON Schema 是一个用于验证 JSON 文档的 JSON 文档。我想要一个用 JSON 编写的模式来验证 Java POJO。

下面的例子(我使用 validate 作为类 Validator 的静态函数):

public static void main(String[] args) {
        String schema = "{\n" +
                "  \"type\": \"object\",\n" +
                "  \"properties\": {\n" +
                "    \"street_address\": { \"type\": \"string\" },\n" +
                "    \"city\":           { \"type\": \"string\" },\n" +
                "    \"state\":          { \"type\": \"string\" }\n" +
                "  },\n" +
                "  \"required\": [\"street_address\", \"city\", \"state\"]\n" +
                "}";
        Object foo = new Hashtable();

        ((Map)foo).put("street_address","first street");
        ((Map)foo).put("street_address","The city");
        ((Map)foo).put("street_address","Not the USA");

        Validator validator = new Validator(schema);

        if (Validator.validate(foo, schema)) {
            System.out.println("It's validated");
        } else
            System.err.println("It isn't validated");
    }

【问题讨论】:

  • 我正在检查,但到目前为止,它似乎适用于注释。我需要加载模式并将其动态验证到可能是或不是映射的对象,换句话说,任何 POJO 对象。休眠验证器可以做到这一点吗?你能详细说明一下吗?
  • 您需要类似 XSD 的 XML 来验证 JSON 元素,而不是语法。正确吗?
  • 我或多或少地针对“等效”,休眠验证仅适用于 java 类上的注释。但是通过谷歌搜索你可以找到这个github.com/java-json-tools/json-schema-validator(但我对这个库没有经验)
  • 我不确定我是否理解你的问题。我需要一个基于 JSON 的 POJO 验证机制。换句话说,使用 JSON 模式来验证 POJO 中是否包含所有元素。

标签: java json jsonschema


【解决方案1】:

您正在寻找 OPEN API:https://github.com/OAI/OpenAPI-Specification

这是以前的 SWAGGER 工具 (https://swagger.io),它允许在 JSON / YAML / XML 中定义对象。 这经常用于:

  1. 记录您的 API 和您可以接收的对象
  2. 根据 JSON 中定义的结构生成客户端存根
  3. 通过将 JSON 集成到其他工具(例如:邮递员)中来帮助创建测试套件

这不仅允许您记录您的 POJO,还允许您记录许多其他内容。很强大。

【讨论】:

  • 我知道 swagger (Open API) 但这是用于文档/开发 API 并为 RESTful API 创建其客户端。在这种情况下,我什至没有使用 REST,所以我看不到这里的用处大摇大摆。谢谢。
  • 你是对的。我添加了另一个答案。检查那个。谢谢
【解决方案2】:

我刚刚遇到这个项目,它完全符合您的要求: https://github.com/everit-org/json-schema

这是一个模式示例:

{
    "type" : "object",
    "properties" : {
        "rectangle" : {"$ref" : "#/definitions/Rectangle" }
    },
    "definitions" : {
        "size" : {
            "type" : "number",
            "minimum" : 0
        },
        "Rectangle" : {
            "type" : "object",
            "properties" : {
                "a" : {"$ref" : "#/definitions/size"},
                "b" : {"$ref" : "#/definitions/size"}
            }
        }
    }
}

示例 JSON:

{
    "rectangle" : {
        "a" : -5,
        "b" : 5
    }
}

在这种情况下,抛出的ValidationException 将指向#/rectangle/a

try {
  schema.validate(rectangleSingleFailure);
} catch (ValidationException e) {
  // prints #/rectangle/a: -5.0 is not higher or equal to 0
  System.out.println(e.getMessage());
}

【讨论】:

  • 再次感谢。但这会根据 JSON 模式验证 JSON 文档,而不是根据 JSON 模式验证 Java POJO。您可以将 POJO 转换为 JSON,但这不是我想要的。
【解决方案3】:

你可以看看这个library。您可以根据 JSON 模式验证 Java POJO。它支持 JSON 模式 v3 和 v4。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多