python - 如何将字典列表序列化为 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
}
]
我已经尝试过这些(使用它们各自的进口),但没有一个有效:
- 返回 JsonResponse(response_list, safe=False)
- json.dumps(response_list, 安全 = False)
- serializers.serialize('json', response_list)
谁能告诉解决方法是什么?
我需要返回 json 响应,但它给出的错误如下:
“TypeError:TypeError 类型的对象不是 JSON 可序列化的”
解决方案
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
}
]
最后,您将需要复杂对象的字典或字符串表示形式。您可以从客户端的字符串/字典构建正确的复杂对象。
推荐阅读
- javascript - 我正在创建一个旋转轮,我想提交答案,通过单击旋转后出现的按钮旋转到我的电子邮件后
- symfony - Symfony 将角色列添加到管理仪表板
- google-colaboratory - google colab pro 订阅中出现 Google 驱动器错误
- reactjs - 笑话:“未找到根 [0] 选项中的目录”
- javascript - 如何使用 JavaScript 获取特定数据/项目?
- android - Fcm 推送通知仅在某些设备(如 Tecno 或 Infinix Android)下无法在终止状态下工作
- javascript - 字体大小不会改变 Chart.js 版本 3.2.1
- dolphindb - dolphindb中的分区不一致问题
- swift - 如何在 Swift 的不同视图控制器中更新同一实体的属性?
- c++ - 对象的内存分配总是四舍五入到 2 的最高幂