问题
我有一个Cerberus Json模式文件,我需要基于模式生成Json文件,并在给定data_types的情况下使用默认值。字典对象中的键_type
是要检查的data_type。
Cerberus Json Schema示例
{
"schema": {
"vars": {
"forest_config": {
"_type": "list",
"_required": false,
"_not_empty": false,
"_item_schema": {
"_type": "dict",
"always_create_dl_here": {
"_required": false,
"_type": "bool"
},
"ldap_domain": {
"_type": "string",
"_required": false
},
"dc_dn": {
"_type": "string",
"_required": true,
"_not_empty": true,
"_regex": "^(DC|O)=[\\w\\-\\. &]+(,(DC|O)=[\\w\\-\\. &]+)*$"
},
"user_ou": {
"_type": "string",
"_required": true,
"_not_empty": false,
"_regex": "^((CN|OU)=[\\w\\-\\. &]+(,(CN|OU)=[\\w\\-\\. &]+)*)?$"
},
"group_ou": {
"_type": "string",
"_required": true,
"_not_empty": false,
"_regex": "^((CN|OU)=[\\w\\-\\. &]+(,(CN|OU)=[\\w\\-\\. &]+)*)?$"
},
"dl_group_ou": {
"_type": "string",
"_required": true,
"_not_empty": false,
"_regex": "^((CN|OU)=[\\w\\-\\. &]+(,(CN|OU)=[\\w\\-\\. &]+)*)?$"
}
}
}
}
}
}
字符串
我试着做我自己的递归函数,但是我被卡住了
new_obj = {}
def recursively_generate_schema_obj(dict_obj: Dict):
if isinstance(dict_obj, dict):
var_name = None
for key, value in dict_obj.items():
if not str(key).startswith("_"):
var_name = key
if var_name and '_type' not in dict_obj:
new_obj[var_name] = {}
elif var_name and '_type' in dict_obj and dict_obj['_type'] == 'list':
new_obj[var_name] = [recursively_generate_schema_obj(dict_obj)]
else:
new_obj[var_name] = create_default_type_value(dict_obj['_type'])
recursively_generate_schema_obj(value)
recursively_generate_schema_obj(schema_data)
def get_default_value(data_type:str):
if data_type == 'string':
return ''
elif data_type == 'dict':
return {}
elif data_type == 'bool':
return False
elif data_type == 'list':
return []
elif data_type == 'int':
return 0
elif data_type == 'enum': # this needs to be handled in the calling function
return ''
型
代码当前输出
{'schema': {}, 'vars': {}, 'forest_config': {}, None: '', 'always_create_dl_here': {}, 'ldap_domain': {}, 'dc_dn': {}, 'user_ou': {}, 'group_ou': {}, 'dl_group_ou': {}}
型
这肯定是错的
应该是
{
"schema": {
"vars": {
"forest_config": [
{
"always_create_dl_here": false,
"ldap_domain": "",
"dc_dn": "",
"user_ou": "",
"group_ou": "",
"dl_group_ou": ""
}
]
}
}
}
型
询问
有人能帮我弄清楚这一点,并解释一些可能的更好的方法?
1条答案
按热度按时间5q4ezhmt1#
你就差一点就能成功了。我修改了函数,将
var_name
和json_obj
与var_schema
沿着使用。然后,它可以使用来自var_schema
的_type
将var_name
添加到提供的json_obj
。如果var_schema
中定义了更多的变量,那么它会调用函数来添加每个变量。传递该变量的模式细节以及要添加变量的json_obj
。我不熟悉你提到的Cerberus Json模式,所以你可能想在
get_default_value
函数中添加一些额外的代码。希望enum
类型的详细信息在模式中。字符串
上面的代码产生:
型