【问题标题】:How to create JSON schema for validate if given field of type string contains value from given string array如何创建 JSON 模式以验证字符串类型的给定字段是否包含给定字符串数组中的值
【发布时间】:2021-11-21 14:03:29
【问题描述】:

我需要创建 JSON Schema(可以使用任何版本)来验证可能只包含来自其他字段中给定字符串数组的值的字符串字段。

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 jsonschema


    【解决方案1】:

    开箱即用的 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" 替换为该属性,然后将data 的值视为架构。

    最后,对于您的示例,您正在针对此架构进行评估:

    {
        "$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 进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2019-12-17
      • 1970-01-01
      相关资源
      最近更新 更多