根据同一' object '中的另一项验证' object '中的项



[可在https://www.jsonschemavalidator.net复制-只需复制并粘贴JSON对象(注意第一个是示例)]

所以,我希望JSON对象是这样的:
[
{"k": "my_date", "v": "2021-08-04"},
{"k": "item_1", "v": 1},
{"k": "item_2", "v": 2.5},
...
{"k": ".+", "v": <<type - number>>}
]

我想设计一个JSON模式,以确保"my_date"总是一个string,但所有其他项目(无论他们的"k">

我现在得到的是

{
"$id": "#/properties/my-output",
"type": "array",
"title": "The Output Schema",
"items": {
"type": "object",
"properties": {
"k": {
"type": "string"
},
"v": {
"type": "number"
}
}
}
}

但是这显然不起作用,因为

[
{
"k": "my_date",
"v": "2021-08-04"
},
{
"k": "any_name",
"v": 123.2
},
{
"sdf": "sdf"
}
]

失败,因为:

  1. my_date的值是string,这是模式不允许的;
  2. sdf不应该在这里,但是模式接受它。

我应该如何设计模式?

注:我希望会有其他的"k"值,string应为"v"值,所以我希望能够解决这些。

可以避免使用额外的"sdf"属性"additionalProperties": false(与属性"properties"相邻)关键字)。看到https://json-schema.org/understanding-json-schema/reference/object.html附加属性

至于你的日期,你似乎在说它们既可以是字符串也不能是字符串,所以我不确定实际的问题是什么。

事实证明,答案是使用if-else-then语句,像这样(感谢@Ether建议使用additionalProperties):

{
"$id": "#/properties/my-output",
"type": "array",
"title": "The Output Schema",
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"k": {
"type": "string",
},
"v": {
}
},
"if": {
"properties": {
"k": {
"enum": ["my_date"]
}
}
},
"then": {
"properties": {
"v": {
"type": "string"
}
}
},
"else": {
"properties": {
"v": {
"type": "number"
}
}
}
}
}

这里发生的事情如下:最初,我们希望数组中的项具有kv的值。kvalue被限制为字符串- always;但我们没有指定v的约束…然而。

然后,我们显式地指定约束条件:如果k"enum":["my_date", <<add others here>>]之一,那么我们希望该k的类型为string。否则——我们想要一个数字。

上面的模式正确地在以下测试输入中失败(您可以在https://www.jsonschemavalidator.net):

上尝试)
[
{
"k": "my_date",
"v": "2021-08-04"
},
{
"k": "my_date_wrong",
"v": "2021-08-04"
},
{
"k": "some_item",
"v": 123.2
},
{
"k": "some_other_123item",
"v": 123.2
},
{
"sdf": "sdf"
}
]

上面的正确输入在"k": "my_date_wrong"上失败,因为它没有包含在if语句中的enum中。它也正确地在sdf字段上失败,因为它被additionalProperties无效。

这种方法的明显缺点是,如果您有许多必须是字符串的v-s,则需要在if语句中显式枚举它们。

所以,一种方法是使用"oneOf">

{
"type": "object",
"required": ["k", "v"],
"properties": {
"k": {
"type": "string"
},
"v": {}
},
"additionalProperties": false,
"oneOf": [
{"$ref": "#/$defs/dateValue"},
{"$ref": "#/$defs/anyOtherValue"}
],
"$defs":{
"dateValue": {
"properties": {
"k": {
"const": "my_date"
},
"v": { "type": "string" }
},
"additionalProperties": false
},
"anyOtherValue": {
"not": {
"properties": {
"k": {
"enum": ["my_date"]
}
}
}
}
}
}

相关内容

  • 没有找到相关文章

最新更新