如何根据它在 Java 中指定的版本规范验证 json 模式

Posted

技术标签:

【中文标题】如何根据它在 Java 中指定的版本规范验证 json 模式【英文标题】:How to validate a json schema against the version spec it specifies in Java 【发布时间】:2016-07-04 16:19:58 【问题描述】:

给定一个像这样的 json 架构..

"$schema": "http://json-schema.org/draft-04/schema#", “标题”:“产品”, "description": "Acme 目录中的产品", “类型”:“对象”, “特性”: “ID”: "description": "产品的唯一标识符", “类型”:“整数” , “姓名”: "description": "产品名称", “类型”:“字符串” , “价钱”: “类型”:“数字”, “最小”:0, "exclusiveMinimum": true , “必需”:[“id”、“名称”、“价格”]

如何验证这个 json 模式是否符合它指定的 $schema,在本例中是 draft-04..

java中有没有可以做到这一点的包? 我可以使用https://github.com/everit-org/json-schema 之类的东西,还是仅根据其架构验证 json 文档?

谢谢。

【问题讨论】:

【参考方案1】:

从每个 JSON 模式链接的模式实际上是 JSON 模式的一种“元模式”,因此您实际上可以按照您的建议使用它来验证模式。

假设我们将元模式保存为一个名为meta-schema.json 的文件,而我们的潜在模式为schema.json。首先我们需要一种方法将这些文件加载​​为JSONObjects

public static JSONObject loadJsonFromFile(String fileName) throws FileNotFoundException 
    Reader reader = new FileReader(fileName);
    return new JSONObject(new JSONTokener(reader));

我们可以加载元模式,并将其加载到您链接的 json-schema 库中:

JSONObject metaSchemaJson = loadJsonFromFile("meta-schema.json");
Schema metaSchema = SchemaLoader.load(metaSchemaJson);

最后,我们加载潜在的模式并使用元模式对其进行验证:

JSONObject schemaJson = loadJsonFromFile("schema.json");
try 
    metaSchema.validate(schemaJson);
    System.out.println("Schema is valid!");
 catch (ValidationException e) 
    System.out.println("Schema is invalid! " + e.getMessage());

鉴于您发布的示例,这将打印“架构有效!”。但是如果我们要引入一个错误,例如将"name" 字段的"type" 更改为"foo" 而不是"string",我们会得到以下错误:

Schema is invalid! #/properties/name/type: #: no subschema matched out of the total 2 subschemas

【讨论】:

以上是关于如何根据它在 Java 中指定的版本规范验证 json 模式的主要内容,如果未能解决你的问题,请参考以下文章

java 如何找到数组中指定的元素的下标

Java学习总计(二十六)——JavaScript正则表达式,Js表单验证,原生js+css页面时钟

json 这个Gruntfile.js将清理你的dist文件夹,根据html中指定的配置连接和缩小所有js,css资产,放置修订,缩小

删除数组中指定的某个对象

如何调试 Gradle 为啥使用我在依赖子项目中指定的不同版本的库?

根据key找到JSON字符串中指定的value值(Java实现)