【问题标题】:What is the difference between "anyof" and "oneof" in z schema?z模式中的“anyof”和“oneof”有什么区别?
【发布时间】:2015-12-02 08:40:07
【问题描述】:

看起来两者都适用于我的输入验证代码。那么具体有什么区别呢?

带有 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"}
   }
 }
]

【问题讨论】:

  • 文档是怎么说的?您对文档的哪一部分有疑问?

标签: json validation jsonschema json-schema-validator


【解决方案1】:

如果您查看 JSON Schema 文档,它会说:

anyOf:

...

一个实例成功验证了这个关键字,如果它 成功验证 至少一个架构由此定义 关键字的值。请注意,在收集注释时,所有 必须检查子模式,以便从 每个成功验证的子模式。

oneOf:

...

一个实例成功验证了这个关键字,如果它 成功验证 恰好一个架构由此定义 关键字的值。

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

【讨论】:

  • 哈哈哈......很好......这意味着...... oneof = 一个接一个地写这么多 if 和 else 语句,而 anyof = 写 if 和 elseif...... :) 不是'是吗?
  • @Somnath:我无法理解这个问题,但如果我理解它,你就会把它倒过来。 anyOf 将要求针对每个模式测试该项目,直到它至少匹配一个,然后可以忽略后面的模式(不管它是否匹配它们)。 oneOf 表示该项目需要针对每个模式进行测试,即使它匹配一个,如果它匹配另一个,测试需要失败。
  • 没错。非常感谢@T.J。克劳德
【解决方案2】:

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

{
    "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)。

【讨论】:

    猜你喜欢
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多