Как сериализовать список словарей в json и вернуть ответ?

class HelloView(ModelViewSet):
  serializer_class = HelloSerializer
  def get(self, request, *args, **kwargs):
    range_type = request.data['range_type'].lower()
    if range_type == "daily":
        try:
            client = MongoClient('localhost', 27017)
            db = client['MyDatabase'] 
            from_date=datetime.datetime.strptime(request.data['from_date'], "%Y-%m-%d")
            to_date = datetime.datetime.strptime(request.data['to_date'], "%Y-%m-%d")
            response_list = []
            for i in db.MyCollection.find({"date": {'$gte': from_date,
                                                              '$lte': to_date}}):
                response_list.append(i)
            return JsonResponse(response_list, safe=False)
        except Exception as e:
            return Response({"status": e}, status=HTTP_400_BAD_REQUEST)

У меня есть список словарей как:

response_list = [
    {
        '_id': ObjectId('5c5ac3227e23080a2beac8a5'),
        'date': datetime.datetime(2019, 2, 3, 0, 0),
        'per_service_bill': {'network': 5.234823, 'storage': 0.00355492071},
        'total_cost': 5.23837792071
    },
    {
        '_id': objectid('5c5ac32d7e23080a2beac8be'),
        'date': datetime.datetime(2019, 2, 4, 0, 0),
        'per_service_bill': {'network': 4.9254925499999995, 'storage': 0.00351209034},
        'total_cost': 4.92900464034
    }
] 

Я пробовал это (с соответствующим импортом), но никто не работает:

  1. вернуть JsonResponse (response_list, safe = False)
  2. json.dumps (response_list, safe = False)
  3. serializers.serialize ('json', response_list)

Может кто-нибудь сказать, что за починка?

Мне нужно вернуть ответ JSON, но он выдает ошибку как:

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

1 ответ

Тип ObjectId неясен, а datatime - сложный тип. Json специализируется на сериализации словарей, списков, целых чисел, чисел с плавающей запятой и строк. Все, чего нет в этом списке типов, нельзя сериализовать. Я пропустил объекты ObjectId, и я получил ошибку Object of type 'datetime' is not JSON serializable

Одним из решений было бы привести в порядок ваши переменные:

response_list = [
  {
    '_id': str(ObjectId('5c5ac3227e23080a2beac8a5')),
    'date': str(datetime.datetime(2019, 2, 3, 0, 0)),
    'per_service_bill': {'network': 5.234823, 'storage': 0.00355492071},
    'total_cost': 5.23837792071
  },
  {
    '_id': str(ObjectId('5c5ac32d7e23080a2beac8be')),
    'date': str(datetime.datetime(2019, 2, 4, 0, 0)),
    'per_service_bill': {'network': 4.9254925499999995, 'storage': 0.00351209034},
    'total_cost': 4.92900464034
  }
]

В конце вам понадобится словарь или строковое представление ваших сложных объектов. Вы можете построить правильный сложный объект из строки / словаря на стороне клиента.

Другие вопросы по тегам