使用 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 ... }
(实施真的不应该像那样填充默认值,因为这与规范相反,但这是正交的。)
我正在使用 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 ... }
(实施真的不应该像那样填充默认值,因为这与规范相反,但这是正交的。)