当前位置: 首页 > 知识库问答 >
问题:

验证至少一个包含特定值的JSON架构属性

汪建德
2023-03-14

我想知道我是否可以定义一个JSON模式(草案4),它要求许多属性中至少有一个具有特定的值。

为了说明这一点,下面是一个我希望验证失败的JSON示例:

{
    "daysOfWeek": {
        "mon": false,
        "tue": false,
        "wed": false,
        "thu": false,
        "fri": false,
        "sat": false,
        "sun": false
    }
}

但是,如果上面的任何(一个或多个)属性设置为true,只有这样我才会期望它通过验证。

那么模式是什么呢?

{
    "daysOfWeek": {
        "type": "object",
        "properties": {
            "mon": { "type": "boolean" },
            "tue": { "type": "boolean" },
            "wed": { "type": "boolean" },
            "thu": { "type": "boolean" },
            "fri": { "type": "boolean" },
            "sat": { "type": "boolean" },
            "sun": { "type": "boolean" }
        },
        "anyOf": [{
            // ?
        }]
    }
}

非常感谢提前!

共有2个答案

广宏远
2023-03-14

可以使用enum关键字指定属性具有特定值。您可以将该技巧与anyOf结合使用,以获得所需的验证行为。

{
  "type": "object",
  "properties": {
    "daysOfWeek": {
      "type": "object",
      "properties": {
        "mon": { "type": "boolean" },
        "tue": { "type": "boolean" },
        "wed": { "type": "boolean" },
        "thu": { "type": "boolean" },
        "fri": { "type": "boolean" },
        "sat": { "type": "boolean" },
        "sun": { "type": "boolean" }
      },
      "anyOf": [
        {
          "properties": {
            "mon": { "enum": [true] }
          }
        },
        {
          "properties": {
            "tue": { "enum": [true] }
          }
        },
        {
          "properties": {
            "wed": { "enum": [true] }
          }
        },
        {
          "properties": {
            "thu": { "enum": [true] }
          }
        },
        {
          "properties": {
            "fri": { "enum": [true] }
          }
        },
        {
          "properties": {
            "sat": { "enum": [true] }
          }
        },
        {
          "properties": {
            "sun": { "enum": [true] }
          }
        }
      ]
    }
  }
}
司毅庵
2023-03-14

@Jason的答案对于您这里的案例来说是好的(并且可读)。在一般情况下(您可能拥有任意数量的属性),有一种更简洁的方法(但可读性较差):

您可以将您的需求重新表述为“不允许所有属性都为false”,在这种情况下,模式可以是:

{
    "type": "object",
    "properties": {...},
    "not": {
        "additionalProperties": {"enum": [false]}
    }
}

addtionalProperties位于子架构中,因此它没有连接到根级别的属性值。因此,它适用于所有属性。

not内部的子模式只有在所有属性都为false时才会通过-因此,外部模式只有在并非所有属性都为false时才会通过。

 类似资料:
  • 我想使用正则表达式来验证名称。名称必须包含名、中间名、姓氏(不一定全部)。但我还想设置一个条件,即名称必须至少包含四个字符。我在这里找到了用于验证全名的正则表达式Java regex to validate full name…,并在这里找到用于检查字符串中是否至少有三个字符(字母)的正则表达式regex,以检查是否至少有3个字符。但我不确定如何将这两者结合起来以获得期望的结果。请帮助我实现所需的

  • 我有以下请求URL: http://localhost:9082/v1/action/query 我有以下请求在wiremck请求文件: > {"queryString":"从我的详细信息中选择firstname, lastname, workphone, id, aintId} {“请求”:{“方法”:“发布”,“url”:“/v1/action/query”,“bodyPatterns”:[{

  • 问题内容: 如何检查以下json中数组中的至少一个元素是否具有具有值的属性? 目前,我正在使用06版草案(此处为 FAQ )。 这是我的NOT WORKING模式: 问题答案: 我设法用弄清楚了。在此版本中,添加了新的关键字。根据此规范草案: 包含 此关键字的值必须是有效的JSON模式。如果数组实例的至少一个元素对给定架构有效,则该数组实例对“包含”有效。 工作模式:

  • 在我的< code>swagger.yaml中有一个这样的模式对象定义: 但是,生成的服务器仍然乐意接受使用此模式对象作为不包含任何字段的必需主体参数的POST请求。 我是否可以这样配置Swagger:<code>颜色</code>字段在<code>用户

  • 我有一个endpoint,其响应如下: 状态的可能值如下:活动、非活动、已删除。要检查架构,我尝试了以下操作: 为了验证,我使用以下句子:然后匹配 但它不起作用。这就是错误所在 实际值:“活动”,应为:[“已删除”、“活动”、“非活动”],原因:实际值与列表中的值不同 你能帮帮我吗?

  • 我想知道我是否可以定义一个JSON模式(草案4),它至少需要对象的许多属性中的一个。我已经知道、和之一,但就是不知道如何以我想要的方式使用它们。 下面是一些JSON示例来说明: