python - 用于映射的漏勺模式,其中键是可变的,但值是数组

标签 python json colander

如何在漏勺中为以下形式的 JSON 定义架构?

{
    'data' : {
        'key_1' : [123, 567],
        'key_2' : ['abc','def'],
        'frank_underwood' : [666.66, 333.333],
        ... etc ...
    }
}

“数据”中的键可以是任何字符串,值是数组。

目前,我有以下内容,但它并没有真正限制映射可以具有的值的类型。

class Query(colander.MappingSchema):
    data = colander.SchemaNode(
        colander.Mapping(unknown='preserve'),
        missing={}
    )

描述这个的正确方法是什么?

最佳答案

一个可能的解决方案是使用 custom validator .

这是一个自定义验证器的完整工作示例,它检查任意映射的所有值是否都是单类型数组。

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()

关于python - 用于映射的漏勺模式,其中键是可变的,但值是数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22210693/

相关文章:

python - 添加 CSS 使输入表单变形

Python:有没有办法在函数定义中使用 "unimported"对象?

python - 如何使用 golang 从重定向的 url 获取响应内容

python - 如何停止 scrapy 蜘蛛但处理所有想要的项目?

c# - 将参数传递给 json webservice

java - JPQL 查询返回没有字段名称的对象

php - 通过键名仅从 JSON 获取特定键/值,而不是全部

python - 有没有办法使变形/漏勺表单字段只读/禁用?

python - Web API 客户端包装器的缓存算法

python - 如何在 Deform/Colander 中进行简单的值检查和错误消息