小编典典

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

java

给定这样的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文档?

谢谢。


阅读 250

收藏
2020-11-26

共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模式库中:

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",我们会得到以下错误:

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