【问题标题】:python jsonschema validation fails when additionalProperties is set to false当 AdditionalProperties 设置为 false 时,python jsonschema 验证失败
【发布时间】:2018-09-27 19:04:34
【问题描述】:

我正在尝试在 python 脚本中定义一个模式,以便立即用于验证一些 json 数据。架构定义如下所示:

    response_schema = {
    "required": ["identifiers" ],
    "properties": {
        "identifiers": {
          "minProperties": 1,"maxProperties": 1,
          "additionalProperties": {
            "required": [  "name","surname" ],
            "properties": {
              "surname": {
                  "required": ["sur1", "sur2" ],
                  "properties": {
                     "sur1": { },
                     "sur2": { }
              } },
              "name": {},

            "additionalProperties": false
            }
          }
        }
      },
    "additionalProperties": false
}

该架构在任何在线验证器中都可以正常工作,但是当我在脚本中执行验证时:

validate(response_body_dict, response_schema)

我收到以下错误:

NameError: name 'false' 未定义

如果我从架构中删除 "additionalProperties" : false 行,我不会收到错误消息,但它当然对我不起作用,因为它的限制性要小得多。

谁能解释一下为什么会出现这个错误?

【问题讨论】:

  • 嗨!谢谢你的提问。你能告诉我们你正在使用什么图书馆吗? (具体来说)。我怀疑这个问题与使用旧版本 JSON Schema 的库有关。如果是这种情况,可能有一个简单的解决方案。最好始终将 $schema 包含在架构的根目录中,这样人们就可以知道您使用的是什么版本的 JSON 架构。
  • 嗨!架构草案是版本 4,我在 2.6.0 和 3.0.0a2 版本的 jsonschema 库中都遇到了错误。谢谢!
  • 在这种情况下,我看不出架构有任何问题。我建议你向 github 上的库提交一个错误。

标签: python json jsonschema


【解决方案1】:

问题在于 Python 和 JSON 之间的差异。在 Python 中,您将其拼写为“False”,而在 JSON 中,您将其拼为“false”。

如果您将架构复制到文本文件中并使用 json 模块加载它,它将正常工作 - 没有错误。

当您在 Python 程序中加载此 sn-p 代码时,您会收到您提供的错误,因为 Python 不知道“假”是什么。该代码正在创建字典,而不是 JSON 模式。

如果您想在适当的位置进行原型设计,可以将其包装在 """ 中,然后使用 json.loads。

像这样:

import json
response_schema_str = """{
    "required": ["identifiers" ],
    "properties": {
        "identifiers": {
            "minProperties": 1,
            "maxProperties": 1,
            "additionalProperties": {
                "required": [
                    "name",
                    "surname" ],
                "properties": {
                    "surname": {
                        "required": [
                            "sur1",
                            "sur2" ],
                        "properties": {
                            "sur1": { },
                            "sur2": { }
                        }
                    },
                    "name": {},
                    "additionalProperties": false
                }
            }
        }
    },
    "additionalProperties": false
}"""
response_schema = json.loads(response_schema_str)
print(response_schema)

【讨论】:

    【解决方案2】:

    在我的 python 脚本中尝试针对类似的 JSON 模式进行验证时,我遇到了同样的错误。由于 ChipJust 提供的原因,我将 false 更改为 False,它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2021-02-01
      相关资源
      最近更新 更多