Xia*_* Yu 11 python json colander
如何在漏勺中为以下形式的JSON定义模式?
{
'data' : {
'key_1' : [123, 567],
'key_2' : ['abc','def'],
'frank_underwood' : [666.66, 333.333],
... etc ...
}
}
Run Code Online (Sandbox Code Playgroud)
'data'中的键可以是任何字符串,值是数组.
目前,我有以下内容,但它并没有对映射可以具有的值类型进行任何限制.
class Query(colander.MappingSchema):
data = colander.SchemaNode(
colander.Mapping(unknown='preserve'),
missing={}
)
Run Code Online (Sandbox Code Playgroud)
描述这个的正确方法是什么?
一种可能的解决方案是使用自定义验证器。
这是自定义验证器的完整工作示例,用于检查任意映射的所有值是否都是单类型数组。
import colander
def values_are_singularly_typed_arrays(node, mapping):
for val in mapping.values():
if not isinstance(val, list):
raise colander.Invalid(node, "one or more value(s) is not a list")
if not len(set(map(type, val))) == 1:
raise colander.Invalid(node, "one or more value(s) is a list with mixed types")
class MySchema(colander.MappingSchema):
data = colander.SchemaNode(
colander.Mapping(unknown='preserve'),
validator=values_are_singularly_typed_arrays
)
def main():
valid_data = {
'data' : {
'numbers' : [1,2,3],
'reals' : [1.2,3.4,5.6],
}
}
not_list = {
'data' : {
'numbers' : [1,2,3],
'error_here' : 123
}
}
mixed_type = {
'data' : {
'numbers' : [1,2,3],
'error_here' : [123, 'for the watch']
}
}
schema = MySchema()
schema.deserialize(valid_data)
try:
schema.deserialize(not_list)
except colander.Invalid as e:
print(e.asdict())
try:
schema.deserialize(mixed_type)
except colander.Invalid as e:
print(e.asdict())
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1768 次 |
| 最近记录: |