如何在棉花糖中设置JSON编码器?

时间:2016-03-09 16:13:39

标签: python json

如何覆盖使用marshmallow库的JSON编码器,以便它可以序列化Decimal字段?我想我可以通过覆盖基础{{1}中的json_module来实现此目的}}或Schema类,但我不知道如何:

https://github.com/marshmallow-code/marshmallow/blob/dev/marshmallow/schema.py#L194

我搜索了所有文档并阅读了代码,但我不是Python本机。

3 个答案:

答案 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.Decimalas_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"
   }, 
}