首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我使用的是JSON模式的if-else条件,是否有方法为JSON中存在的任何附加键引发错误?

如果我使用的是JSON模式的if-else条件,是否有方法为JSON中存在的任何附加键引发错误?
EN

Stack Overflow用户
提问于 2020-04-27 04:03:22
回答 1查看 888关注 0票数 2

我有一个用例,根据不同键的值,我想检查JSON中的键。

示例JSON-1:

代码语言:javascript
复制
{ 
  "key_name" : "value1",
  "foo" : "random_value1"
}

示例JSON-2:

代码语言:javascript
复制
{ 
  "key_name" : "value2",
  "bar" : "random_value2"
}

根据这些例子,

规则1.如果"key_name“的值是"value1”,那么JSON中应该出现只存在 "foo“键。

如果"key_name“的值是"value2",那么只有 "bar”键应该出现在JSON中。

我编写了以下JSON模式来验证这些JSON:

代码语言:javascript
复制
{
  "type": "object",
  "properties": {
    "key_name": {
      "type": "string",
      "enum": [
        "value1",
        "value2"
      ]
    },
    "foo": {
      "type": "string"
    },
    "bar": {
      "type": "string"
    }
  },
  "required": [
    "key_name"
  ],
  "additionalProperties": false,
  "allOf": [
    {
      "if": {
        "properties": {
          "key_name": {
            "enum": [
              "value1"
            ]
          }
        }
      },
      "then": {
        "required": [
          "foo"
        ]
      }
    },
    {
      "if": {
        "properties": {
          "key_name": {
            "enum": [
              "value2"
            ]
          }
        }
      },
      "then": {
        "required": [
          "bar"
        ]
      }
    }
  ]
}

现在,按照规则,下面的JSON是无效的,应该会引发一个错误。

代码语言:javascript
复制
{ 
  "key_name" : "value1",
  "foo" : "random_value1",
  "bar" : "random_value2"
}

代码语言:javascript
复制
{ 
  "key_name" : "value2",
  "bar" : "random_value2",
  "foo" : "random_value"
}

但是,上面的无法做到这一点。它只根据"key_name“的值检查"foo"/"bar”键是否正确。它无法检查是否存在任何新密钥。

怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2020-04-27 04:36:01

这里已经回答了这个问题:Mutually exclusive property groups

此外,您还可以在这里找到一个很好的概述:jsonSchema attribute conditionally required

对于您的具体示例,您会想到以下方法:

  1. "not": { "required": ["bar"] }添加到第一个then子句中,以指示不允许使用"bar""foo"在第二个then子句中也是如此。
  2. 如果总是只允许"key_name"和另一个属性,也可以简单地在主模式中添加"maxProperties": 2 .

编辑(地址选择白名单):

另一个选择是分别定义每个置换,如下所示:

代码语言:javascript
复制
{
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "key_name": { "const": "value1" },
        "foo": { "type": "string" }
      },
      "required": ["key_name", "foo"],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "key_name": { "const": "value2" },
        "bar": { "type": "string" }
      },
      "required": ["key_name", "bar"],
      "additionalProperties": false
    }
  ]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61451539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档