Объект типа Decimal не может быть JSON сериализуемым - PullRequest
0 голосов
/ 06 августа 2020

Выполнение лямбды завершилось неудачно со статусом 200 из-за ошибки функции клиента: объект типа «Decimal» не JSON сериализуемый

Я просмотрел все существующие решения по следующей ссылке но у меня ничего не работало. Что я делаю не так ?: Python JSON сериализовать объект Decimal

import json
import boto3
import decimal


client = boto3.resource('dynamodb')
table = client.Table('table')

def lambda_handler(event, context):
    method = event["httpMethod"]
    print(event)
    if method=="POST":
        return POST(event)
    elif method=="DELETE":
        return DELETE(event)
    elif method=="GET":
        return GET(event)

#the respons format
def send_respons(responseBody, statusCode):
    response = {
        "statusCode": statusCode,
        "headers": {
            "my_header": "my_value"
        },
        "body": json.dumps(responseBody),
        "isBase64Encoded": 'false'
    }
    return response
    

def GET(event):
    tab = table.scan()['Items']
    ids = []
            for item in tab:
                    ids.append({"id":item["id"], "decimalOBJ":decimal.Decimal(item["decimalOBJ"]}))
            return send_respons(ids, 201)

1 Ответ

0 голосов
/ 06 августа 2020

Кажется, у вас есть два варианта:

  1. Вероятно, самый простой, вы можете сериализовать значение int / float объекта Decimal:

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

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

d_json = json.dumps(d)

Вы можете добавить simple json в свой файл requirements.txt, который теперь поддерживает сериализацию десятичных знаков. Это прямая замена для прилагаемого модуля json.
import simplejson as json # instead of import json

Остальная часть вашего кода будет работать так же. Если вам нужна дополнительная помощь, оставьте комментарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...