'Decimal'类型的对象不可JSON序列化

时间:2020-08-06 07:25:35

标签: python json

由于客户函数错误,Lambda执行失败,状态为200:“ Decimal”类型的对象不可JSON序列化

我在以下链接中浏览了所有现有的解决方案,但对我没有任何帮助。我究竟做错了什么?: Python JSON serialize a Decimal object

{{1}}

3 个答案:

答案 0 :(得分:3)

以下是扩展 JSONEncoder 以处理 json docs 中也指定的 Decimal 类型的示例

from decimal import Decimal

class DecimalEncoder(json.JSONEncoder):
  def default(self, obj):
    if isinstance(obj, Decimal):
      return str(obj)
    return json.JSONEncoder.default(self, obj)

调用它使用

json.dumps(some_object, cls=DecimalEncoder)

通过转换为 str 可以保持良好的精度,而无需依赖外部包。

答案 1 :(得分:0)

似乎您有两个选择:

  1. 最简单的方法是,您可以序列化Decimal对象的int / float值:

win.send_keystrokes("{VK_MENU DOWN}fa{VK_MENU UP}")

""" assume d is your decimal object """

serializable_d = int(d) # or float(d)

  1. 您可以将simplejson添加到您的requirements.txt中,该文件现在支持序列化十进制数。它是包含的json模块的直接替代。
d_json = json.dumps(d) 

您其余的代码将相同。如果您需要进一步的帮助,请发表评论。

答案 2 :(得分:0)

创建一个函数来处理 TypeError 并使用 defaultjson.dumps 参数来设置它。这避免了TypeError: Object of type Decimal is not JSON serializable

https://docs.python.org/3/library/json.html

<块引用>

如果指定,默认应该是一个被调用的函数 不能以其他方式序列化的对象。它应该返回一个 JSON 对象的可编码版本或引发 TypeError。如果不 指定,引发 TypeError。

json_utils.py:

import decimal
import json


def dumps(item: dict) -> str:
    return json.dumps(item, default=default_type_error_handler)


def default_type_error_handler(obj):
    if isinstance(obj, decimal.Decimal):
        return int(obj)
    raise TypeError

test_json_utils.py:

import json
from decimal import Decimal
from commons import json_utils


def test_different_data_types():
    # Prepare data
    item = {
        "a-string": "lorem",
        "a-boolean": True,
        "a-number": 4711,
        "a-decimal-object": Decimal(4711)  # Used by dynamoDb boto3 client
    }

    # Execute
    item_as_json = json_utils.dumps(item)

    # Assert
    item_back_to_dict = json.loads(item_as_json)
    assert item_back_to_dict == item