z架构中“anyof”和“oneof”之间有什么区别?

时间:2015-12-02 08:40:08

标签: json validation jsonschema json-schema-validator

它看起来像我的输入验证代码一样正常。那么确切的区别是什么?

带有oneof的架构

[{
  "id": "MyAction",
  "oneOf": [{ "$ref": "A1" },
            { "$ref": "A2" }]
 },
 {
  "id": "A1",
  "properties": {
      "class1": { "type": "string"},
      "class2": { "type": "string"}
   }
 },
 {
  "id": "A2",
  "properties": {
      "class2": { "type": "string"},
      "class3": { "type": "string"}
   }
 }
]

架构与任何

    [{
  "id": "MyAction",
  "anyOf": [{ "$ref": "A1" },
            { "$ref": "A2" }]
 },
 {
  "id": "A1",
  "properties": {
      "class1": { "type": "string"},
      "class2": { "type": "string"}
   }
 },
 {
  "id": "A2",
  "properties": {
      "class2": { "type": "string"},
      "class3": { "type": "string"}
   }
 }
]

2 个答案:

答案 0 :(得分:13)

如果你看JSON Schema documentation,就说:

  

5.5.4。 anyOf

     

5.5.4.1。有效值

     

此关键字的值必须是一个数组。这个数组必须至少有一个元素。

     

数组的元素必须是对象。每个对象必须是有效的JSON模式。

     

5.5.4.2。成功验证的条件

     

如果该关键字针对此关键字的值定义的至少一个架构成功验证,则该实例会成功验证此关键字。

     

5.5.5。 oneOf

     

5.5.5.1。有效值

     

此关键字的值必须是一个数组。这个数组必须至少有一个元素。

     

数组的元素必须是对象。每个对象必须是有效的JSON模式。

     

5.5.5.2。成功验证的条件

     

如果某个实例针对此关键字的值定义的完全一个架构成功验证,则该实例会成功验证此关键字。

请注意我在上面的重点。 anyOf表示该项必须针对至少一个(但可能是多个)模式进行验证。 oneOf表示它必须仅针对模式中的一个进行验证。

答案 1 :(得分:0)

我的任务很晚,但据我了解,此关键字的用法取决于对象/父对象本身的类型。例如,如果您尝试为对象或数组元素的单个属性定义类型。以以下示例为例:

{
    "title": "Sample JSON Schema",
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "definitions": {
        "propObjectType1" : {
            "name": "string",
            "age": "number"
        },
        "propObjectType2" : {
            "name": "string",
            "dob": {
                "type": "string",
                "pattern": "\\d\\d\/\\d\\d\/\\d\\d\\d\\d"
            }
        }
    },
    "properties": {
        "prop1": {
            "type": "string",
            "maxLength": 64
        },
        "prop2": {
            "anyOf": [
                {
                    "$ref": "#/definitions/propObjectType1"
                },
                {
                    "$ref": "#/definitions/propObjectType2"
                }
            ] 
        },
        "prop3": {
            "oneOf": [
                {
                    "$ref": "#/definitions/propObjectType1"
                },
                {
                    "$ref": "#/definitions/propObjectType2"
                }
            ] 
        },
        "prop4Array": {
            "type": "array",
            "items": {
                "oneOf": [
                    {
                        "$ref": "#/definitions/propObjectType1"
                    },
                    {
                        "$ref": "#/definitions/propObjectType2"
                    }
                ] 
            }       
        },
        "prop5Array": {
            "type": "array",
            "items": {
                "anyOf": [
                    {
                        "$ref": "#/definitions/propObjectType1"
                    },
                    {
                        "$ref": "#/definitions/propObjectType2"
                    }
                ] 
            }       
        }
    }
}

因此,在上面的定义中,prop2和prop3是相同的(可以互换使用anyOfoneOf),并且可以定义自己喜欢的对象。但是,如果是数组:

  1. 当您将anyOf用于项目类型时,元素可以是那些元素之外的任何类型,并且数组可以包含混合项目。意味着您可以拥有一个类型为1的项目,而可以拥有另一个类型为2的项目。
  2. 当您将oneOf用于项目类型时,元素可以是那些元素之外的任何类型,并且数组只能包含一种类型的项目。表示所有项目都必须是同一类型(类型1或类型2)。