首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON架构条件: require和not require

JSON架构条件: require和not require
EN

Stack Overflow用户
提问于 2018-11-21 01:36:05
回答 3查看 14.1K关注 0票数 8

我正在尝试实现这个条件:如果某个特定属性存在,则需要另一个属性;但如果该属性不存在,则不需要另一个属性。

另外,在JSON模式中,我们可以在依赖中使用not吗?

以下是一个示例模式

代码语言:javascript
复制
var schema = {
    "properties": {
        "smaller": {
            "type": "number"
        },
        "larger": { "type": "number" },
        "medium":{'type':'string'},
        "bulky":{'type':'string'}
    },
    require:['smaller','larger'],
    additionalProperties:false
};

如果存在"medium“,则需要"bulky”。否则,不需要"bulky“。

这里"not required“的意思是,如果"medium”不存在,那么一定不会出现bulky。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-21 09:11:59

即使不使用JSON Schema draft-07 if-then-else,也有几种方法可以达到所需的效果。

逻辑运算符和蕴含(草案-04及以上)

这里的逻辑含义是:如果"medium“存在,则"bulky”可被翻译为"medium“not present或"bulky”is " required“(后者暗示"medium”存在),其可进一步阐述为"medium“not required或"bulky”为"required“(因为如果"medium”存在,它将满足被要求的条件)。请参阅下面的模式:

代码语言:javascript
复制
"properties": {
  "smaller": {"type": "number"},
  "larger": { "type": "number" },
  "medium":{"type":"string"},
  "bulky":{"type":"string"}
},
"required":["smaller","larger"],
"anyOf" : [ 
  { 
    "not" : { "required" : ["medium"] }
  },
  {
    "required" : ["bulky"]
  }
],
"additionalProperties" : false

请查看此处以供参考:

JSON schema - valid if object does *not* contain a particular property

http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.7

"anyOf“-逻辑或,"oneOf”-异或,"allOf“-与,”非“-否定,但要注意规范:

如果实例无法根据该关键字定义的架构成功验证,则该实例对该关键字有效。

draft-06 -依赖关系+ propertyNames

最明显的是。我不确定你是否在你的问题中排除了这一点,所以放在这里以防万一。请注意,如果您不想简单地限制有效键,可以使用"propertyNames“来代替"additionalProperties”(这实际上就是添加它的目的)。

代码语言:javascript
复制
"properties": {
  "smaller": {"type": "number"},
  "larger": { "type": "number" },
  "medium":{"type":"string"},
  "bulky":{"type":"string"}
},
"required":["smaller","larger"],
"dependencies" : {
  "medium" : ["bulky"]
},
"propertyNames" : {
  "enum" : [
    "smaller",
    "larger",
    "medium",
    "bulky"
  ]
}

点击此处查看参考资料:http://json-schema.org/latest/json-schema-validation.html#rfc.section.6.5.7

更新

在评论中澄清之后:

草案6的

-这里的“不需要”意味着如果“中”不存在,那么大的“一定不存在”

“一定不能”意味着防止笨重的存在。

我会重新表述你的病情:

1.如果"medium“存在,"bulky”必须存在,->两个键必须同时存在。

2.如果"medium“不存在,"bulky”不能同时存在, -> 不能同时存在。

“体量”是否存在,而“中等”是否不存在?

不是的。请参见2。反之亦然(请参见1)。布尔相等(与逻辑异或互补)。

因此,如果"bulky“存在-它意味着"medium”必须一直在那里...这意味着两者都是必需的,或者不能都是必需的(甚至是允许的)。

因为它是draft-06,所以您还可以使用"propertyNames“来定义允许的属性名称(这是此逻辑的一种快捷方式)。

逻辑运算符和蕴涵(草案-06及以上)

转换为JSOn模式的正确逻辑操作如下所示:

代码语言:javascript
复制
"oneOf" : [
  { "required" : ["medium","bulky"] }, <== this schema is satisfied if both keys appear in validated instance
  {
    "allOf" : [   <== !medium ^ !bulky - due to how "not" works in schema context
      {"not" : { "required" : ["medium"] } },  
      {"not" : { "required" : ["bulky"] } },
    ]
  }
]

一个XOR -或(两者都需要)或(不需要中,也不需要大)。

请注意,我不是在做" not“:{ "required”:"medium","bulky“},因为当只有一个键存在时,"required”模式将失败,这意味着"not“将返回成功的验证结果。我们需要用德摩根定律来重新表述:

代码语言:javascript
复制
"oneOf" : [
  { "required" : ["medium","bulky"] },
  {
    "not" : {   <=== !medium ^ !bulky = !(medium v bulky)
      "anyOf" : [
        { "required" : ["medium"] },
        { "required" : ["bulky"]  },
      ]
    }
  }
]

不过,使用"propertyNames“也可以做到这一点。请参阅以下架构:

代码语言:javascript
复制
{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "properties": {
    "smaller": {"type": "number"},
    "larger": { "type": "number" },
    "medium":{"type":"string"},
    "bulky":{"type":"string"}
  },
  "required":["smaller","larger"],
  "anyOf" : [ 
    { 
       "required" : ["medium","bulky"]
    },
    {
      "propertyNames" : {
        "enum" : [
          "smaller",
          "larger"
        ]
      },
    }
  ],
  "examples" : [
    {
      "smaller" : 1,
      "larger" : 2,


    },
    {
      "smaller" : 1,
      "larger" : 2,
      "bulky" : "test",
      "medium" : ""
    },
    {
      "smaller" : 1,
      "larger" : 2,

      "medium" : ""
    },
    {
      "smaller" : 1,
      "larger" : 2,
      "bulky" : "test",

    },
  ]
}

它回答了你的问题吗?

票数 15
EN

Stack Overflow用户

发布于 2018-11-21 05:27:12

JSON模式草案-07包含了these new keywords ifthenelse,它们允许您使用条件模式。

在此示例中:

  • foo属性为required
  • However如果foo设置为"bar",则bar属性也变为必需的

代码语言:javascript
复制
var ajv = new Ajv({
  allErrors: true
});

var schema = {
  "properties": {
    "foo": {
      "type": "string"
    },
    "bar": {
      "type": "string"
    },

  },
  "required": ["foo"],
  "if": {
    "properties": {
      "foo": {
        "enum": ["bar"]
      }
    }
  },
  "then": {
    "required": ["bar"]
  }
}

var validate = ajv.compile(schema);

test({
  "foo": "bar",
  "bar": "baz"
}); // VALID

test({
  "foo": "xyz"
}); // VALID

test({
  "foo": "bar",
}); // NOT VALID


function test(data) {
  var valid = validate(data);
  if (valid) console.log('VALID', data);
  else console.log('NOT VALID', data);
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/ajv/6.5.5/ajv.min.js"></script>

希望这是有意义的,你可以相应地调整你的代码。

PS:在您的模式中,您有require属性,我不确定它是否是有效的JSON schema关键字。您可能指的是required

票数 4
EN

Stack Overflow用户

发布于 2019-11-11 16:48:20

如果有多个属性依赖于各自的值,则可以使用属性依赖关系。

代码语言:javascript
复制
{
  "type": "object",
  "properties": {
    "weight_1": {
        "type": "integer"
    },
    "weight_2": {
        "type": "integer"
    },
    "description_1": {
        "type": "string" 
    },
    "description_2": {
        "type": "string" 
    }
  },
  "allOf": [
    {
        "if": {
          "properties": {
            "weight_1": {
                "minimum": 10 
            }
          }
        },
        "then": {
          "dependencies": {
            "weight_1": ["description_1"]
          }
        }
    },
    {
        "if": {
          "properties": {
            "weight_2": {
                "minimum": 100
            }
          }
        },
        "then": {
          "dependencies": {
            "weight_2": ["description_2"]
          }
        }
    }
  ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53398519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档