经过一番研究,我想出了以下答案:
查看实际情况的最佳方法是找到一些示例。它
碰巧在 draft04 模式中有几个这样的例子
本身(定义、properties、patternProperties、...)和它们
通常遵循相同的模式。
例如,draft04 模式的 definitions 属性定义了什么
应该出现在 definitions 属性的架构中。这里是
与 definitions 属性关联的子模式:
"definitions": {
"type": "object",
"additionalProperties": { "$ref": "#" },
"default": {}
},
这表示“#/definitions/”处的条目必须是一个对象。事实
它是一个 json 对象意味着它本身将具有唯一的键。现在
对于对象中的 values,这就是 additionalProperties
旨在描述。在这种情况下,它表示每个值
属性本身必须符合模式“#”的根。这是什么
表示有效 json 模式的 definitions 属性对象中的每个值
对象也必须是模式。
如果这是像 C++ 一样的类型,它可能看起来像:
std::map< std::string, Schema > definitions;
实际上,带有字符串键的映射可以被认为是一个 json
具有结构化值类型的对象。因此,要创建自己的:
std::map< std::string, T >
-
首先定义 T 的架构。例如:
"definitions" : {
"movie" : {
"properties": {
"title" : { "type" : "string" },
"year_made" : { "type" : "integer" },
"rating" : { "type" : "integer" }
}
}
}
-
对于存储的值类型 T,决定是否要允许任何
属性,只要将这些指定的属性键入为
上面指定。如果您只想要这些属性,请添加
“附加属性”:假
"definitions" : {
"movie" : {
"additionalProperties" : false,
"properties": {
"title" : { "type" : "string" },
"year_made" : { "type" : "integer" },
"rating" : { "type" : "integer" }
}
}
}
-
还要确定您是否真的需要所有属性
为电影有效。如果是这样,请添加一个必需的条目。
"definitions" : {
"movie" : {
"additionalProperties": false,
"required" : [ "title", "year_made", "rating" ],
"properties": {
"title" : { "type" : "string" },
"year_made" : { "type" : "integer" },
"rating" : { "type" : "integer" }
}
},
-
现在定义了电影的shape T。为
引用电影模式的电影集合或映射
定义为草案模式中的定义。注:在
"movie_map" additionalProperties 的含义不同于
“电影”。在“电影”的情况下,它是一个布尔值 false
这表明除了列出的内容之外没有其他属性
属性。在“movie_map”的情况下,它意味着 - 如果有
附加属性,它们必须看起来像这个架构。但,
因为在 movie_map 中没有指定任何属性,这实际上意味着
对象实例中的所有属性都必须符合#/definitions/movie。现在都
“movie_map”中的值看起来像定义的 movie 架构。
{
"definitions" : {
"movie" : {
"additionalProperties": false,
"required" : [ "title", "year_made", "rating" ],
"properties": {
"title" : { "type" : "string" },
"year_made" : { "type" : "integer" },
"rating" : { "type" : "integer" }
}
},
"movie_map" : {
"type": "object",
"additionalProperties": { "$ref": "#/definitions/movie" },
"default": {}
}
}
}
-
现在在模式中的某处使用定义的模式movie_map:
{
"title" : "movie data",
"additionalProperties" : false,
"required" : [ "movies" ],
"properties" : {
"movies" : { "$ref" : "#/definitions/movie_map" }
},
"definitions" : {
"movie" : {
"additionalProperties": false,
"required" : [ "title", "year_made", "rating" ],
"properties": {
"title" : { "type" : "string" },
"year_made" : { "type" : "integer" },
"rating" : { "type" : "integer" }
}
},
"movie_map" : {
"type": "object",
"additionalProperties": { "$ref": "#/definitions/movie" },
"default": {}
}
}
}
这是一个示例对象,可以将其视为电影的地图
验证架构:
{
"movies" : {
"the mission" : {
"title":"The Mission",
"year_made":1986,
"rating":5
},
"troll 2" : {
"title":"Troll 2",
"year_made":1990,
"rating":2
}
}
}