由于客户函数错误,Lambda执行失败,状态为200:“ Decimal”类型的对象不可JSON序列化
我在以下链接中浏览了所有现有的解决方案,但对我没有任何帮助。我究竟做错了什么?: Python JSON serialize a Decimal object
{{1}}
答案 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)
似乎您有两个选择:
win.send_keystrokes("{VK_MENU DOWN}fa{VK_MENU UP}")
""" assume d is your decimal object """
serializable_d = int(d) # or float(d)
d_json = json.dumps(d)
您其余的代码将相同。如果您需要进一步的帮助,请发表评论。
答案 2 :(得分:0)
创建一个函数来处理 TypeError
并使用 default
的 json.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