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

如何指定属性是否不应存在或包含 null?

祖迪
2023-03-14

一年前,我问过如何根据另一个属性的值设置模式对象的类型?我有一个很好的答案,从那以后我一直在使用这个模式。

现在,源数据已经更改——在以下情况下,模式会失败:

源数据包含许多属性,但其中只有两个与此问题相关:“键”和“值” - “值”的类型取决于“键”的值 -

所以我的问题是,我如何允许这两个选项中的一个?我已经尝试了我能想到的任何组合,但是悲惨地失败了。Json.Schema.JSchema无法解析文本。

以下是我当前使用的架构的简化版本:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "TestOptionalObject",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "test"
  ],
  "properties": {
    "test": {
      "$ref": "#/definitions/test"
    }
  },
  "definitions": {
    "test": {
      "type": "object",
      "required": [
        "key"
      ],
      "properties": {
        "key": {
          "type": "string",
          "enum": [
            "comment",
            "offset",
            "standby",
            "status_unsure",
            "status_ok"
          ]
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "event": {
                "enum": [
                  "standby",
                  "status_unsure",
                  "status_ok"
                ]
              }
            }
          },
          "then": {
            "properties": {
              "value": false
            }
          }
        },
        {
          "if": {
            "properties": {
              "key": {
                "const": "comment"
              }
            }
          },
          "then": {
            "properties": {
              "value": {
                "$ref": "#/definitions/commentValue"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "key": {
                "const": "offset"
              }
            }
          },
          "then": {
            "properties": {
              "value": {
                "$ref": "#/definitions/offsetValue"
              }
            }
          }
        }
      ]
    },
    "commentValue": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "text"
      ],
      "properties": {
        "text": {
          "type": "string"
        }
      }
    },
    "offsetValue": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "seconds"
      ],
      "properties": {
        "seconds": {
          "type": "integer",
          "format": "int32"
        }
      }
    }
  }
}

以下是我尝试过的一些事情:

"then": {
  "properties": {
    "anyOf": [
      { "value": false },
      { "value": null }
    ]
  }
}
"then": {
  "anyOf": [
  {
    "properties": {
      { "value": false }
    },
    "properties": {
      { "value": null }
    }
  ]  
}
"then": {
  "properties": {
    "value": 
      "anyOf": [false, null ]
  }
}

应失败:

{
  "test": {
    "key": "comment",
      "value": {"seconds":12}
  }
}

{
  "test": {
    "key": "standby",
     "value": {"asdf":12}
  }
}

应该通过:

{
  "test": {
    "key": "comment",
     "value": {"text":"comment text"}
  }
}


{
  "test": {
    "key": "offset",
     "value": {"seconds":12}
  }
}

{
  "test": {
    "key": "standby"
  }
}

{
  "test": {
    "key": "standby",
     "value": {}
  }
}

请注意最后一个示例 - value 属性是一个空对象 - 该示例也应该通过,但在当前架构中失败,因为对于此键,value 属性根本不应存在。

共有1个答案

倪棋
2023-03-14

你很接近了,但还不完全是。你必须记住< code>allOf是一个子模式(JSON模式)的数组。(Null不是有效的模式,所以您可能会得到一些“不是有效模式”的错误。)

因此,请考虑从allOf[0]...

{
  "if": {
    "properties": {
      "key": {
        "enum": [
          "standby",
          "status_unsure",
          "status_ok"
        ]
      }
    }
  },
  "then": {
    "properties": {
      "value": {
        "type": [
          "object"
        ],
        "additionalProperties": false
      }
    }
  }
}

你可以在这里测试:https://jsonschema.dev/s/EfNI1

if 块保持不变。(尽管我已经纠正了我认为在使用事件时的错误,而不是从实际架构简化的

要实现“空对象”,您需要使用< code > additional properties 。

  • additionalProperties将其值子模式应用于所有存在的属性,这些属性未在属性中定义,或者与模式属性中的键(正则表达式)匹配
  • false,因为模式验证总是失败

 类似资料:
  • 我正在检查是否存在一个对象属性,该属性带有一个包含所讨论的属性名的变量。 这是,因为它正在查找,但我希望它检查

  • 问题内容: 如何检查seleniumWeb元素是否包含特定的CSS类。 我有这个html li元素 如您所见,在class属性内部有一个活动类。 我的问题是我有这个元素,我想根据class属性是否具有其他“ active”值进行检查,这是比使用xpath更优雅的解决方案。 我怎样才能做到这一点? 问题答案: 鉴于您已经找到了您的元素,并且您想检查class属性内的某个类: 正如@aurelius正

  • 问题内容: 最近,我阅读了越来越多的关于人们在其HTML标记中使用自定义属性的信息,主要目的是为了嵌入一些额外的数据以供javascript代码使用。 我希望就使用自定义属性是否是一种好习惯以及一些替代方法收集一些反馈。 现在看来似乎真的可以简化 既 服务器端和客户端的代码,但它也不是W3C标准。 我们是否应该在Web应用程序中使用自定义HTML属性?为什么或者为什么不? 对于那些认为自定义属性是

  • 问题内容: 该事务是否会回滚,或者是否还需要在批注中包含RuntimeException.class? 问题答案: 无需包括在列表中。即使您不提及它,它也会处理。 我已经尝试了jdbcTemplate:-

  • 问题内容: 最近,我阅读了越来越多的关于人们在其HTML标记中使用自定义属性的信息,主要目的是为了嵌入一些额外的数据以供javascript代码使用。 我希望就使用自定义属性是否是一种好习惯以及一些替代方法收集一些反馈。 现在看来似乎真的可以简化 既 服务器端和客户端的代码,但它也不是W3C标准。 我们是否应该在Web应用程序中使用自定义HTML属性?为什么或者为什么不? 对于那些认为自定义属性是

  • 问题内容: 我再次使用swift数组和NSArray仅提供的containsObject! 我将swift数组桥接到NSArray来执行以下操作: 它通常可以正常工作,但是只要我放一个String就可以了!在字符串类型的数组中,它崩溃。即使containsObject确实占用了AnyObject! 声明一个字符串!数组也无济于事 但是一样没有效果很好 那么我该如何显式包装东西?我真的不明白为什么我