首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >漏斗:如何处理嵌套模式的空值

漏斗:如何处理嵌套模式的空值
EN

Stack Overflow用户
提问于 2020-09-10 23:45:42
回答 1查看 94关注 0票数 1

使用colander 1.5.1,如果我将null传递给由嵌套模式定义的属性:

代码语言:javascript
复制
class ChildSchema(colander.Schema):
    a = colander.SchemaNode(colander.Integer(), missing=None)
    b = colander.SchemaNode(colander.Integer(), missing=None)

class ParentSchema(colander.Schema):
    c = colander.SchemaNode(colander.Integer(), missing=None)
    d = ChildSchema(missing=None)
代码语言:javascript
复制
example json:
{
    "c": 1,
    "d": null
}

然后我在反序列化时得到这个错误:

代码语言:javascript
复制
"\"None\" is not a mapping type: Does not implement dict-like functionality."

未按预期传递属性d函数,并反序列化为None。我如何正确地处理传递给嵌套模式的null值的反序列化?根据文档,我希望行为返回NoneDeserialization Combinations

EN

回答 1

Stack Overflow用户

发布于 2021-04-07 02:10:36

请考虑以下几点:

您需要以下导入。

代码语言:javascript
复制
import colander
from colander import SchemaType, Invalid, null

以下内容与您的子架构相同。

代码语言:javascript
复制
class ChildSchema(colander.Schema):
    a = colander.Schema(colander.Integer(), missing=None)
    b = colander.Schema(colander.Integer(), missing=None)

下面是所有魔术发生的地方。我们创建自己的类型。请注意,它可能缺少漏斗SchemaTypes中内置的一些基本功能(如序列化)。如果接收到的对象为null或None,则返回not changes。如果它不是null或None并且不是字典,它将引发一个错误,如果它是一个字典,它将使用您的ParentSchema进行序列化,即使父对象的属性为null或None ({"d":null})。

代码语言:javascript
复制
class MyType(SchemaType):
    def deserialize(self, node, cstruct):
        if cstruct is null:
            return null
        if cstruct is None:
            return None
        if not isinstance(cstruct, dict):
            raise Invalid(node, '%r is not an object' % cstruct)
        else:
            return ChildSchema().deserialize(cstruct)

我们使用魔术类型创建父模式:

代码语言:javascript
复制
class ParentSchema(colander.Schema):
    c = colander.SchemaNode(colander.Integer(), missing=None)
    d = colander.SchemaNode(MyType(), missing=None)

"d“将如你所愿被反序列化。现在让我们看看它的用法的一些例子:

代码语言:javascript
复制
schema = ParentSchema()

示例1. "d“为空(主要问题)

代码语言:javascript
复制
schema.deserialize({"c": 1, "d": null})

输出1

代码语言:javascript
复制
{"c": 1, "d": None}

示例2. "d“为None

代码语言:javascript
复制
schema.deserialize({"c": 1, "d": None})

输出2

代码语言:javascript
复制
{"c": 1, "d": None}

示例3.正常行为

代码语言:javascript
复制
schema.deserialize({'c': 1, 'd': {'a': 1}})

输出3。

代码语言:javascript
复制
{'c': 1, 'd': {'a': 1, 'b': None}}

示例5.错误"d“不是dict

代码语言:javascript
复制
 schema.deserialize({'c': 1, 'd': [] })

输出5

代码语言:javascript
复制
 # Invalid: {'d': '[] is not an object'}

示例6.错误验证器不是数字

代码语言:javascript
复制
 schema.deserialize({'c': 1, 'd': {'a': "foobar"}})

输出6

代码语言:javascript
复制
# Invalid: {'a': u'"foobar" is not a number'}

为了写出这个答案,我使用了https://docs.pylonsproject.org/projects/colander/en/latest/extending.html作为源代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63833271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档