如何覆盖使用marshmallow库的JSON编码器,以便它可以序列化Decimal
字段?我想我可以通过覆盖基础{{1}中的json_module
来实现此目的}}或Schema
类,但我不知道如何:
https://github.com/marshmallow-code/marshmallow/blob/dev/marshmallow/schema.py#L194
我搜索了所有文档并阅读了代码,但我不是Python本机。
答案 0 :(得分:6)
如果要序列化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)
答案 1 :(得分:0)
我认为解决方案是将marshmallow.fields.Decimal
与as_string=True
:
默认情况下,此字段序列化为
decimal.Decimal
对象。如果你 需要将数据呈现为JSON,请记住json
模块 来自标准库不编码decimal.Decimal
。因此, 您必须使用可以处理小数的JSON库,例如simplejson
,或通过传递as_string=True
序列化为字符串。
答案 2 :(得分:0)
我有同样的问题,我最终将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"
},
}