给定这样的json模式。
{ “ $ schema”:“ http://json-schema.org/draft-04/schema#”, “ title”:“产品”, “ description”:“来自Acme目录的产品”, “ type”:“对象”, “属性”:{ “ID”: { “ description”:“产品的唯一标识符”, “ type”:“整数” }, “名称”: { “ description”:“产品名称”, “ type”:“字符串” }, “价钱”: { “ type”:“数字”, “最小值”:0, “ exclusiveMinimum”:是 } }, “必填”:[“ id”,“名称”,“价格”] }
如何验证此json模式是否符合其指定的$ schema,在本例中为草案04。
java中是否有任何软件包可以做到这一点?我可以使用https://github.com/everit-org/json- schema之类的东西,还是仅根据其架构验证json文档?
谢谢。
实际上,从每个JSON模式链接的模式都是JSON模式的一种“元模式”,因此您实际上可以按照您的建议使用它来验证模式。
假设我们已经将元模式存储为meta- schema.json,并将潜在模式存储为schema.json。首先,我们需要一种将这些文件加载为的方式JSONObjects:
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模式库中:
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()); }
给定您发布的示例,它打印“ Schema is valid!”。但是,如果我们通过改变引入一个错误,例如"type"在的"name"领域"foo",而不是"string",我们会得到以下错误:
"type"
"name"
"foo"
"string"
Schema is invalid! #/properties/name/type: #: no subschema matched out of the total 2 subschemas