有条件地验证 json 架构中的数组对象之一
validate one of the Array object in json schema conditionally
下面的 json 只有在 type 是 mobile 和 endDate[=33= 时才有效] 是 empty/null,否则验证需要失败。这里 type 可以有任何值,但我只在 mobile 类型上验证。
有效json:
{
"contacts": [
{
"type": "mobile",
"endDate": "",
"number": "1122334455"
},
{
"type": "home",
"endDate": "",
"number": "1111122222"
},
{
"type": "mobile",
"endDate": "12-Jan-2017",
"number": "1234567890"
},
]
}
无效json:(因为联系人没有有效的手机号码)
{
"contacts": [
{
"type": "mobile",
"endDate": "12-Jan-2021",
"number": "1122334455"
},
{
"type": "home",
"endDate": "",
"number": "1111122222"
},
{
"type": "mobile",
"endDate": "12-Jan-2017",
"number": "1234567890"
},
]
}
我试过的架构
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"type": "object",
"properties": {
"contacts": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"endDate": {
"type": [
"string",
"null"
]
},
"number": {
"type": "string"
}
},
"anyOf": [
{
"if": {
"properties": {
"type": {
"const": "mobile"
}
}
},
"then": {
"properties": {
"endDate": {
"maxLength": 0
}
}
}
}
]
}
}
}
}
任何人都可以为我提供上述 json 的正确架构,附上示例代码 here, this is valid json but getting error. Invalid json example is here 为什么因为类型 mobile 没有空的 endDate。
提前致谢。
您的架构定义 properties > data
,但您的实例数据使用 contacts
而不是 data
。更改其中任何一个都可以解决您的问题。您在其他方面做得正确。
(如果您只有一个 type
要检查,则不需要将 if/then
架构包装在 anyOf
中。)
我找到了一些答案,我们不需要使用 anyOf
或 oneOf
。右边的是contains
。 contains
的地方也是母校。工作示例是 here
这是正确的架构
{
"type": "object",
"properties": {
"contacts": {
"type": "array",
"minItems": 1,
"contains": {
"type": "object",
"properties": {
"type": {
"const": "mobile"
},
"endDate": {
"type" : ["string", "null"],
"maxLength": 0
}
},
"required": ["type"]
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"endDate": {
"type": [
"string",
"null"
]
},
"number": {
"type": "string"
}
}
}
}
}
}
下面的 json 只有在 type 是 mobile 和 endDate[=33= 时才有效] 是 empty/null,否则验证需要失败。这里 type 可以有任何值,但我只在 mobile 类型上验证。
有效json:
{
"contacts": [
{
"type": "mobile",
"endDate": "",
"number": "1122334455"
},
{
"type": "home",
"endDate": "",
"number": "1111122222"
},
{
"type": "mobile",
"endDate": "12-Jan-2017",
"number": "1234567890"
},
]
}
无效json:(因为联系人没有有效的手机号码)
{
"contacts": [
{
"type": "mobile",
"endDate": "12-Jan-2021",
"number": "1122334455"
},
{
"type": "home",
"endDate": "",
"number": "1111122222"
},
{
"type": "mobile",
"endDate": "12-Jan-2017",
"number": "1234567890"
},
]
}
我试过的架构
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"type": "object",
"properties": {
"contacts": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"endDate": {
"type": [
"string",
"null"
]
},
"number": {
"type": "string"
}
},
"anyOf": [
{
"if": {
"properties": {
"type": {
"const": "mobile"
}
}
},
"then": {
"properties": {
"endDate": {
"maxLength": 0
}
}
}
}
]
}
}
}
}
任何人都可以为我提供上述 json 的正确架构,附上示例代码 here, this is valid json but getting error. Invalid json example is here 为什么因为类型 mobile 没有空的 endDate。 提前致谢。
您的架构定义 properties > data
,但您的实例数据使用 contacts
而不是 data
。更改其中任何一个都可以解决您的问题。您在其他方面做得正确。
(如果您只有一个 type
要检查,则不需要将 if/then
架构包装在 anyOf
中。)
我找到了一些答案,我们不需要使用 anyOf
或 oneOf
。右边的是contains
。 contains
的地方也是母校。工作示例是 here
这是正确的架构
{
"type": "object",
"properties": {
"contacts": {
"type": "array",
"minItems": 1,
"contains": {
"type": "object",
"properties": {
"type": {
"const": "mobile"
},
"endDate": {
"type" : ["string", "null"],
"maxLength": 0
}
},
"required": ["type"]
},
"items": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"endDate": {
"type": [
"string",
"null"
]
},
"number": {
"type": "string"
}
}
}
}
}
}