17

假设我有以下 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
   }
 }
}

我可以想出更多(例如“任何”和“对象”的反转角色),但它们都是这三个示例的派生。

4

1 回答 1

35

[免责声明:这里是下一个 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。事实上,很少有人这样做。请参阅下面的链接以获取支持两者的在线模式验证器的链接。

我阅读您的问题的另一种方式是,您希望允许 , 以外的属性idnameprice成为他们喜欢的任何东西。这很简单。只是不要为tagsin定义模式properties

{
    "type": "object",
    "required": [ "id", "name", "price" ]
    "properties": {
        "id": {
            "type": "number"
        },
        "name": {
            "description": "Name of the product"
        },
        "price": {
            "type": "number",
            "minimum": 0
        }
    }
}

由于您没有指定additionalPropertiesas being false,因此对象实例可以具有任意数量的附加成员,并且这些成员可以是任何东西。

链接到可以测试您的模式的在线验证器:这里

于 2013-01-28T05:24:56.003 回答