【问题标题】:Validate every JSON Object item in JSON Array with fastjsonschema in Python使用 Python 中的 fastjsonschema 验证 JSON 数组中的每个 JSON 对象项
【发布时间】:2022-01-14 07:46:22
【问题描述】:

我正在使用 fastjsonschema 来验证包含产品详细信息列表的 JSON 对象。

如果对象缺少值,验证应该使用默认值创建它,例如

validate = fastjsonschema.compile({
'type': 'object',
'properties': {
    'a': {'type': 'number', 'default': 42},
},
})
data = validate({})
assert data == {'a': 42}

但是对于数组,它只会填充您在架构中定义的数组对象的默认值。这意味着如果用户输入的数组项比架构覆盖的多,架构将不会验证额外的项。

有没有办法声明数组中的所有项目都将遵循相同的架构,并且都应该被验证?

目前当我在架构中定义时

{
    "products": {
        "type": "array",
        "default": [],
        "items":[
              {
                "type": "object",
                "default": {},
                "properties": {
                    "string_a": {
                        "type": "string",
                        "default": "a"
                    },
                    "string_b": {
                        "type": "string",
                        "default": "b"
                    }
              }
        ]
    }
}

当我尝试验证时会发生什么

{"products":[{},{}]}

是不是变成了

{"products":[{"string_a":"a","string_b":"b"},{}]}

这可能会导致丢失数据的问题,当然最好对整个事情进行验证。

那么有没有办法为数组中的对象定义架构,然后将该架构应用于数组中的每个项目?

谢谢

【问题讨论】:

    标签: python arrays json schema jsonschema


    【解决方案1】:

    您的items 架构周围有一个额外的数组。您在那里编写它的方式(对于 2020-12 之前的 json 架构版本),带有数组的 items 将单独指定每个项目的架构,而不是所有项目:

    "items": [
      { .. this schema is only used for the first item .. },
      { .. this schema is only used for the second item .. },
      ...
    ]
    

    比较:

    "items": {  .. this schema is used for ALL items ... }
    

    (无论如何,实现确实不应该填充这样的默认值,因为这与规范相反,但这是正交的。)

    【讨论】:

    • 太棒了,谢谢。我偷偷地怀疑它会像那样小,但我想不通。
    猜你喜欢
    • 2019-12-09
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    相关资源
    最近更新 更多