我有一个深层嵌套的json,我正在尝试用cerberus进行验证。 因此,我具有以下结构:(注意:假设有更深的嵌套)
我为第一级创建了架构,但是我无法弄清楚如何在json中更深入。我无法手动编写深度模式,因为我不知道json会降多少级。 据我了解,cerberus可以处理嵌套的json,但是我找不到这种确切情况的任何代码引用。知道如何实现吗?
{
"product_number": "123",
"product_version": "ABC",
"subproducts": [
{
"product_number": "444",
"product_version": "ASD",
"subproducts": [
{
"product_number": "666",
"product_version": "FFF",
"subproducts": [
{
"product_number": "888",
"product_version": "JUN",
"subproducts": []
},
{
"product_number": "644",
"product_version": "GYB",
"subproducts": [
{
"product_number": "8890",
"product_version": "KLM",
"subproducts": []
}
]
}
],
}
],
}
],}
答案 0 :(得分:0)
JSON模式规范中定义的“ $ ref”关键字可能满足您的需求。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["product_number", "product_version", "subproducts"],
"properties": {
"product_number": {
"type": "string"
},
"product_version": {
"type": "string"
},
"subproducts": {
"type": "array",
"items": {
"$ref": "#"
}
}
}
}
如果仅在同级"product_number"
不为空的情况下需要属性"product_version"
和"subproducts"
,则应按如下所示修改JSON模式:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["subproducts"],
"properties": {
"subproducts": {
"type": "array",
"items": {
"$ref": "#"
}
}
},
"anyOf": [
{
"properties": {
"subproducts": {
"maxItems": 0
}
}
},
{
"required": ["product_number", "product_version"],
"properties": {
"subproducts": {
"minItems": 1
},
"product_number": {
"type": "string"
},
"product_version": {
"type": "string"
}
}
}
]
}
答案 1 :(得分:0)
您可以将schema registry用于自引用架构:
from cerberus import schema_registry, Validator
product_schema = {
"product_number": {"type": "string", "regex": "\d+"},
"product_version": {"type": "string", "regex": "[A-Z]+"},
"subproducts": {"type": "list", "schema": "product_schema"}
}
schema_registry.add("product_schema", product_schema)
validator = Validator(product_schema)