Django:输出JSON,而不是OrderedDict

时间:2017-06-15 00:05:56

标签: django django-rest-framework

我有一个奇怪的问题。

我有一个使用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框架能够在上面的例子中很好地序列化......这是怎么做到的?

3 个答案:

答案 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)))

logger保存到django.log中: enter image description here

答案 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并将其序列化为文字。