我有一个奇怪的问题。
我有一个使用Django REST框架构建的API。
我正在打电话并获得以下JSON:
{
"success": true,
"result": {
"user_type": "ta",
"email": "myemail@gmail.com",
"first_name": "John",
"last_name": "Smith",
"mobile_phone": "555-555-5555",
"id": "0f165a85-2da6-4dcb-97cb-bf04900a942b"
}
}
当我尝试从response.data
获取相同的输出并将int写入我的数据库中的文本字段时,我尝试添加日志记录中间件。
对于完全相同的请求response.data
是这样的:(这会写入我的数据库,而不是上面所需的JSON字符串):
{'success': True, 'result': OrderedDict([('user_type', 'ta'), ('email', 'myemail@gmail.com'), ('first_name', 'John'), ('last_name', 'Smith'), ('mobile_phone', '555-555-5555'), ('id', UUID('0f165a85-2da6-4dcb-97cb-bf04900a942b'))])}
为什么?如何摆脱OrderedDict
并从response.data
获取完美的JSON字符串?
请注意:json.dumps
无效。我得到了TypeError: Object of type 'UUID' is not JSON serializable
。我在模型中的整个ID系统都基于UUID。但是,我的Django REST框架能够在上面的例子中很好地序列化......这是怎么做到的?
答案 0 :(得分:2)
您遇到此问题是因为您尝试使用json.dumps
转储内部表示,dumps
不知道如何处理UUID对象。
我可以看到两个选项 - 一个,教response.rendered_content
如何序列化UUID。这可以通过继承JSONDecoder
来完成,例如这SO answer。
但是,DRF已经知道如何序列化这些字段。在调试器中查看,看起来响应文本隐藏在{{1}}中。我会检查你的中间件运行时是否填充了这些内容。
答案 1 :(得分:0)
json.dumps(log_data, indent=2)
这可以将你的dict格式化为你想要的str。
例如:
# save log_data in some way
log_data = {
"success": True,
"result": {
"user_type": "ta",
"email": "myemail@gmail.com",
"first_name": "John",
"last_name": "Smith",
"mobile_phone": "555-555-5555",
"id": "0f165a85-2da6-4dcb-97cb-bf04900a942b"
}
}
logger.info(json.dumps(log_data, indent=2))
print(json.dumps(log_data, indent=2), type(json.dumps(log_data, indent=2)))
答案 2 :(得分:0)
我设法找到了这个发布的解决方案。
https://arthurpemberton.com/2015/04/fixing-uuid-is-not-json-serializable
我将代码添加到我的模型中,现在我在序列化UUID字段时没有得到TypeError: Object of type 'UUID' is not JSON serializable
。这样我就可以在我的json.dumps
上拨打response.data
并将其序列化为文字。