Объект типа 'set' не поддерживает сериализацию в формате JSON

1

Я использую python 3.6 и подключаюсь к dynamodb для извлечения данных. json.dumps(item, indent=4, cls=DecimalEncoder) ошибки на линии json.dumps(item, indent=4, cls=DecimalEncoder) Любые предложения о том, что я делаю неправильно.

import json
import boto3
import decimal

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

class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            if o % 1 > 0:
                return float(o)
            else:
                return int(o)
        return super(DecimalEncoder, self).default(o)

def lambda_handler(event, context):
    # TODO implement
    category_id = event["queryStringParameters"]["id"]
    response = table.get_item(
        Key={
            'category': category_id
            }
           )    

    item = response['Item']
    return {
     "isBase64Encoded": False,
     "statusCode": '200',
     "headers": {},
     "body": json.dumps(item, indent=4, cls=DecimalEncoder)
            }
Теги:

1 ответ

0
Лучший ответ

JSON не поддерживает наборы, поэтому вы должны сделать свой клиентский декодер для json.dumps способным конвертировать наборы в списки:

class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, set):
            return list(o)
        if isinstance(o, decimal.Decimal):
            if o % 1 > 0:
                return float(o)
            else:
                return int(o)
        return super(DecimalEncoder, self).default(o)
  • 1
    Спасибо @blhsing, я изменил мой декодер клиента, и он расшифровал набор.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню