如何覆盖使用marshmallow库的JSON编码器,以便它可以序列化Decimal
字段?我想我可以通过覆盖基本json_module
或Schema
类中的Meta
来做到这一点,但我不知道如何:
https://github.com/marshmallow-code/marshmallow/blob/dev/marshmallow/schema.py#L194
我搜索了所有文档并阅读了代码,但我不是Python本机。
如果要序列化Decimal
字段(并将值保留为数字),可以覆盖Marshmallow在其dumps()
调用中使用的默认json模块,以使用simplejson
。
为此,只需将class Meta
定义添加到模式中,并为此类指定json_module
属性。
例:
import simplejson
class MySchema(Schema):
amount = fields.Decimal()
class Meta:
json_module = simplejson
然后,序列化:
my_schema = MySchema()
my_schema.dumps(my_object)
我认为解决方案是使用marshmallow.fields.Decimal
与as_string=True
:
默认情况下,此字段序列化为
decimal.Decimal
对象。如果需要将数据呈现为JSON,请记住标准库中的json
模块不对decimal.Decimal
进行编码。因此,您必须使用可以处理小数的JSON库,例如simplejson
,或通过传递as_string=True
序列化为字符串。
我有同样的问题,我最终将Schema上的字段更改为字符串。在我的情况下,因为我只是要在json中返回它,所以无论是字符串还是十进制都没关系。
from marshmallow_sqlalchemy import ModelSchema
from marshmallow import fields
class CurrencyValueSchema(ModelSchema):
class Meta:
model = CurrencyValue
value = fields.String()
我回来了json:
{
"currency_values": [
{
"id": 9,
"timestamp": "2016-11-18T23:59:59+00:00",
"value": "0.944304"
},
{
"id": 10,
"timestamp": "2016-11-18T23:59:59+00:00",
"value": "3.392204"
},
}