如何创建 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 进行测试。