如何创建 JSON 模式以验证给定字符串类型的字段是否包含给定字符串数组的值
How to create JSON schema for validate if given field of type string contains value from given string array
我需要创建 JSON 架构(可以使用任何版本)来验证可能只包含其他字段中给定字符串数组的值的字符串字段。
MVE 示例:
对于 "picked"
,唯一有效的值是 "values"
中指定的值
有效:
{
"values": ["Foo", "Bar", "Baz"],
"picked": "Bar"
}
无效:
{
"values": ["Foo", "Bar", "Baz"],
"picked": "NotFromValues"
}
架构:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"values": {
"type": "array",
"items": { "type": "string" }
},
"picked": {
"type": "string"
// How can I validate picked?
}
}
}
开箱即用的 json 架构不支持您想要的内容。您将需要一些自定义逻辑来执行此操作。
关于它的规范回购已经有很多讨论。如果您搜索带有 $data
标签的问题,您将有很多东西可以阅读。缺点是没有人能就它应该如何运作达成一致。这个话题现在几乎被放弃了。
为了解决这个问题,我利用了 2019-09(及更高版本)词汇表 功能。我写了一个 new vocabulary 定义了一个 data
关键字来支持这种行为。问题是它仅在我的实现中受支持(据我所知)JsonSchema.Net,但如果您使用的实现允许您定义自己的关键字,则您可以自己实现它。
对于您的示例,您需要以下内容:
{
"$schema": "https://gregsdennis.github.io/json-everything/meta/data",
"type": "object",
"properties": {
"values": {
"type": "array",
"items": { "type": "string" }
},
"picked": {
"type": "string",
"data": {
"enum": "#/values"
}
}
}
}
(请注意 $schema
值已更改。)
这将在您的实例(一个数组)的根目录找到 values
属性,用它替换 "/values"
,然后评估 [=13= 的值] 是一个模式。
最后,对于您的示例,您正在根据此架构进行评估:
{
"$schema": "https://gregsdennis.github.io/json-everything/meta/data",
"type": "object",
"properties": {
"values": {
"type": "array",
"items": { "type": "string" }
},
"picked": {
"type": "string",
"enum": [ "Foo", "Bar", "Baz" ]
}
}
}
但 enum
的值来自实例。
您可以在 https://json-everything.net/json-schema 进行测试。
我需要创建 JSON 架构(可以使用任何版本)来验证可能只包含其他字段中给定字符串数组的值的字符串字段。
MVE 示例:
对于 "picked"
,唯一有效的值是 "values"
有效:
{
"values": ["Foo", "Bar", "Baz"],
"picked": "Bar"
}
无效:
{
"values": ["Foo", "Bar", "Baz"],
"picked": "NotFromValues"
}
架构:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"values": {
"type": "array",
"items": { "type": "string" }
},
"picked": {
"type": "string"
// How can I validate picked?
}
}
}
开箱即用的 json 架构不支持您想要的内容。您将需要一些自定义逻辑来执行此操作。
关于它的规范回购已经有很多讨论。如果您搜索带有 $data
标签的问题,您将有很多东西可以阅读。缺点是没有人能就它应该如何运作达成一致。这个话题现在几乎被放弃了。
为了解决这个问题,我利用了 2019-09(及更高版本)词汇表 功能。我写了一个 new vocabulary 定义了一个 data
关键字来支持这种行为。问题是它仅在我的实现中受支持(据我所知)JsonSchema.Net,但如果您使用的实现允许您定义自己的关键字,则您可以自己实现它。
对于您的示例,您需要以下内容:
{
"$schema": "https://gregsdennis.github.io/json-everything/meta/data",
"type": "object",
"properties": {
"values": {
"type": "array",
"items": { "type": "string" }
},
"picked": {
"type": "string",
"data": {
"enum": "#/values"
}
}
}
}
(请注意 $schema
值已更改。)
这将在您的实例(一个数组)的根目录找到 values
属性,用它替换 "/values"
,然后评估 [=13= 的值] 是一个模式。
最后,对于您的示例,您正在根据此架构进行评估:
{
"$schema": "https://gregsdennis.github.io/json-everything/meta/data",
"type": "object",
"properties": {
"values": {
"type": "array",
"items": { "type": "string" }
},
"picked": {
"type": "string",
"enum": [ "Foo", "Bar", "Baz" ]
}
}
}
但 enum
的值来自实例。
您可以在 https://json-everything.net/json-schema 进行测试。