使用 Python 中的 fastjsonschema 验证 JSON 数组中的每个 JSON 对象项

Validate every JSON Object item in JSON Array with fastjsonschema in Python

我正在使用 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"},{}]}

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

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

谢谢

您的 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 ... }

(实施真的不应该像那样填充默认值,因为这与规范相反,但这是正交的。)