为什么Python请求的JSON解码器返回顶级键的连接?

2024-09-27 13:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用请求库对JSON响应进行解码,如下所示:

正在解码的有效负载:

{
    "objectOne": {
        "desc": "one"
    },
    "objectTwo": {
        "desc": "two"
    }
}

代码:

from django.http import HttpResponse
import requests

class ApiService:
    @staticmethod
    def say_something(self):
        resp = requests.get('http://127.0.0.1:9501/polls/test/')

        return HttpResponse(resp.json())

输出:

目标一目标二

我遵循官方文件中的简单示例:

JSON Response Content

此外,我将响应包装在[]括号中,以查看响应是否必须在JSON数组中,但它只返回一个数组,其中第一个也是唯一一个元素是objectOneobjectTwo。你知道吗


Tags: 代码importjsonhttp目标数组解码requests
2条回答

你把发生的事情误诊了。requests正在返回正确的词典。但是您正在将字典传递给HttpResponse(),而不进行任何进一步的处理。但是,HttpResponse()未设置为处理字典。你知道吗

发生的情况是HttpResponse()接受一个iterable,并将iterable中的每个值作为一个字符串。实际上,您告诉Django只向客户端发送串接的键。从^{} documentation

content should be an iterator or a string. If it’s an iterator, it should return strings, and those strings will be joined together to form the content of the response.

^{} documentation开始:

iter(d)
Return an iterator over the keys of the dictionary. This is a shortcut for iter(d.keys()).

如果要发送JSON数据,请使用^{} object。它被设置为正确编码Python对象:

from django.http import JSONResponse
import requests


def say_something(request):
    resp = requests.get('http://127.0.0.1:9501/polls/test/')

    return JSONResponse(resp.json())

或者不必费心解码和重新编码,只需传递原始响应数据:

from django.http import HttpResponse
import requests


def say_something(request):
    resp = requests.get('http://127.0.0.1:9501/polls/test/')

    return HttpResponse(resp.text, resp.headers['content-type'])

注意:我删除了类和staticmethod装饰器;当没有共享状态时,在类中包装静态视图函数没有什么意义。使用模块来创建名称空间。你知道吗

您的数据是一个JSON对象,它被解析为Python字典。HttpResponse需要一个iterable,它在返回上游响应时会遍历它;通常您会传递一个字符串(即呈现模板的结果),但在这里您会传递一个字典。遍历字典只会得到关键字。你知道吗

如果要显示完整的输出,请首先通过传递str(response.json())将其转换为字符串—这当然是毫无意义的,因为它与原始响应相同。你知道吗

相关问题 更多 >

    热门问题