假设我有以下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
}
}
}
我可以提出更多(例如“任意”和“对象”的反转角色),但它们都是这三个例子的衍生物。
答案 0 :(得分:34)
[免责声明:此处下一个JSON Schema验证规范的作者]
好的,目前还不清楚你的要求,见下文,但你的一个例子显然没有做你想要的,这就是你写的那个:
{ "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