使用棉花糖的JSON序列化-跳过无属性
我正在使用棉花糖将我的决策类的实例发送到JSON。但是,这也会转储没有的属性,例如,我的属性分数在JSON中会转换为null。之后,我无法使用相同的方法再次读取JSON 最后一行是它当前失败的地方。我需要在加载期间不将None转储到JSON或跳过null:使用棉花糖的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"
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。