gpt4 book ai didi

jsonschema - JSON 模式条件 : require and not require

转载 作者:行者123 更新时间:2023-12-04 17:30:04 26 4
gpt4 key购买 nike

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

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

这是一个示例架构

var schema = {
"properties": {
"smaller": {
"type": "number"
},
"larger": { "type": "number" },
"medium":{'type':'string'},
"bulky":{'type':'string'}
},
require:['smaller','larger'],
additionalProperties:false
};

如果存在“中等”,则需要“笨重”。否则,不需要“笨重”。

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

最佳答案

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

逻辑运算符和含义(draft-04 及以上)

这里的逻辑含义是:如果存在“中等”,则需要“笨重”可以翻译为“不存在中等”或“需要”“笨重”(后者意味着存在“中等”),可以进一步阐述为“medium"不需要或 "bulky"是"required"(因为如果存在"medium",它将满足被要求的条件)。请参阅以下架构:

"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” - 逻辑 OR,“oneOf” - XOR,“allOf” - AND,“not” - 否定,但要注意规范:

An instance is valid against this keyword if it fails to validate successfully against the schema defined by this keyword.



Draft-06 - 依赖项 + propertyNames

最明显。我不确定你是否在你的问题中排除了这个,所以放在这里以防万一。请注意,如果您不想简单地限制有效键,则可以使用“propertyNames”而不是“additionalProperties”(并且实际上是添加它的目的)。
"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

更新

在评论中澄清后:

for draft-6 - here "not require" means that if "medium" dont exist then bulky " must not be present"



“不得”意味着防止出现笨重的东西。

我将改写您的条件:

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

2.如果“中等”不存在“笨重” 绝不能也存在 -> 两个键 绝不能同时在场

“笨重”可以存在而“中等”不存在吗?

不。见2。反之亦然(见1)。 bool 相等(与逻辑 XOR 互补)。

因此,如果“bulky”存在——这意味着“medium”必须始终存在……这意味着两者都是必需的,或者两者都不需要(甚至不允许)。

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

逻辑运算符和含义(draft-06 及以上)

转换为 JSOn Schema 的正确逻辑操作如下所示:
"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 - EITHER(两者都需要)或(不需要中等和不需要笨重)。

请注意我不是在做 "not": { "required": ["medium","bulky"] } 因为当只有其中一个键存在时,“required”模式会失败,这意味着“not”会成功返回验证结果。需要使用 de Morgans 定律对其进行重新表述:
"oneOf" : [
{ "required" : ["medium","bulky"] },
{
"not" : { <=== !medium ^ !bulky = !(medium v bulky)
"anyOf" : [
{ "required" : ["medium"] },
{ "required" : ["bulky"] },
]
}
}
]

但是,使用“propertyNames”也可以解决问题。
请参阅以下架构:
{
"$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",

},
]
}

它回答你的问题吗?

关于jsonschema - JSON 模式条件 : require and not require,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53398519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com