假设我有以下JSON模式
{
"name":"Product",
"type":"object",
"properties":{
"id":{
"type":"number",
"required":true
},
"name":{
"description":"Name of the product",
"required":true
},
"price":{
"required":true,
"type": "number",
"minimum":0,
"required":true
},
"tags":{
"type":"array",
"items":{
"type":"any"
}
}
}
}
但是,我希望标签不是数组,而希望成为根架构的一部分。因此,您可以指定任何属性,但是我特别注意“ id”,“ name”和“ price”
下列哪一项是正确的做法,哪些是完全错误的?
{
"name":"Product",
"type":"object",
"properties":{
"id":{
"type":"number",
"required":true
},
"name":{
"description":"Name of the product",
"required":true
},
"price":{
"required":true,
"type": "number",
"minimum":0,
"required":true
}
},
"additionalProperties": {
"type":"any"
}
}
{
"name":"Product",
"type":"object",
"properties":{
"id":{
"type":"number",
"required":true
},
"name":{
"description":"Name of the product",
"required":true
},
"price":{
"required":true,
"type": "number",
"minimum":0,
"required":true
}
},
"extends": {
"type":"any"
}
}
{
"name":"Product",
"type":["object","any"],
"properties":{
"id":{
"type":"number",
"required":true
},
"name":{
"description":"Name of the product",
"required":true
},
"price":{
"required":true,
"type": "number",
"minimum":0,
"required":true
}
}
}
我可以再提出几个例子(例如“ any”和“ object”的倒置角色),但是它们都是这三个例子的派生词。
最佳答案
[免责声明:此处是下一个JSON模式验证规范的作者]
好的,不清楚您要问什么,请参见下文,但是您的示例之一显然没有满足您的要求,这是您编写的示例:
{ "type": [ "object", "any" ] }
这等效于一个空模式,因此可以验证每个实例。
我读到您的问题的一种方式是,您希望JSON数据是标签数组或至少具有名为
id
,name
和price
成员的对象。由于您似乎正在使用草稿v3,因此您只有一个解决方案:{
"type": [
{
"description": "schema for tags array here",
},
{
"description": "schema for the base object here"
}
]
}
这种构造意味着实例必须遵守
type
内的至少一个模式(您也可以将其与基本类型混合使用)。但是:当前草稿为v4,您现在应该写:
{
"anyOf": [
{
"description": "schema for tags array here",
},
{
"description": "schema for the base object here"
}
]
}
请注意,并非所有实现都支持草案v4或上述
type
的构造。实际上,很少。请参见下面的链接,该链接可同时支持两种模式。我读到您的问题的另一种方式是,您希望允许除
id
,name
和price
之外的其他任意属性。然后,这非常简单。只是不要在tags
中为properties
定义架构:{
"type": "object",
"required": [ "id", "name", "price" ]
"properties": {
"id": {
"type": "number"
},
"name": {
"description": "Name of the product"
},
"price": {
"type": "number",
"minimum": 0
}
}
}
由于未将
additionalProperties
指定为false
,因此对象实例可以具有任意数量的附加成员,并且这些成员可以是任何成员。链接到可以测试您的模式的在线验证器:here
关于json - 使用JSON模式来指定带有某些必填字段的“any”类型模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14550235/