使用棉花糖的JSON序列化-跳过无属性

使用棉花糖的JSON序列化-跳过无属性,json,python-3.x,serialization,marshmallow,Json,Python 3.x,Serialization,Marshmallow,我正在使用棉花糖将我的决策类的实例发送到JSON。但是,这也会转储没有的属性,例如,我的属性分数在JSON中会转换为null。之后,我无法使用相同的方法再次读取JSON 最后一行是它当前失败的地方。我需要在加载期间不将None转储到JSON或跳过null: import json from marshmallow import Schema, fields, post_load json_data = """{ "appid": "2309wfjwef", "strategy"

我正在使用棉花糖将我的决策类的实例发送到JSON。但是,这也会转储没有的属性,例如,我的属性分数在JSON中会转换为null。之后,我无法使用相同的方法再次读取JSON

最后一行是它当前失败的地方。我需要在加载期间不将None转储到JSON或跳过null:

import json
from marshmallow import Schema, fields, post_load

json_data = """{
    "appid": "2309wfjwef",
    "strategy": "First Strategy"
}"""

# Output class definition
class Decision(object):
    def __init__(self, appid = None, strategy = None, score = None):
        self.appid = appid
        self.strategy = strategy
        self.score = score

class DecisionSchema(Schema):
    appid = fields.Str()
    strategy = fields.Str()
    score = fields.Int()

    @post_load
    def make_decision(self, data):
        return Decision(**data)

# Deserialization into object
dec_json = json.loads(json_data)
schema = DecisionSchema()
dec = schema.load(dec_json).data

print(dec.strategy)

# Dump results back to JSON
schema = DecisionSchema()
out = schema.dumps(dec)

print(out.data)

# Load back from dump
schema = DecisionSchema()
dec = schema.load(out).data

#print(dec.strategy) # returns error currently

棉花糖开发团队的官方答案可以在bugtracker中找到:

使用post_转储方法

从棉花糖导入模式、字段、post_转储 类BaseSchema: 跳过值=设置[无] @后垃圾场 def删除值自身,数据,**kwargs: 返回{ key:key的值,data.items中的值 如果值不在self.SKIP_值中 } MySchemaBaseSchema类: foo=fields.Field bar=字段。字段 sch=MySchema sch.dump{'foo':42,'bar':None}.data{'foo':42}
正如我在中指出的,有一个缺点:当字段的allow\u None为True时,它也会删除None。

正如我在上面的评论中指出的,如果使用

class Meta:
    fields = (
        'field1', 'field2'
    )
    ordered = True
为了解决这个问题,我使用了以下方法:

# Remove None fields
@pre_dump
def remove_skip_values(self, data):
    return {
        key: value for key, value in data.items()
        if value is not None
    }

这适用于我对对象的口述

另一个问题是,如果使用ordered=TrueSure,它会扰乱字段顺序。可以修改该方法以保留订单并返回OrderedDict.Nice。由于version post_load总是传递参数many,所以方法应该看起来像def remove_skip_values self,data,many:是的,因为marshmallow 3,修饰的方法必须接受**kwargs。