Python为什么要求';s JSON解码器返回顶级键的串联

Python为什么要求';s JSON解码器返回顶级键的串联,python,json,django,python-requests,Python,Json,Django,Python Requests,我使用请求库对JSON响应进行解码,如下所示: 正在解码的有效载荷: { "objectOne": { "desc": "one" }, "objectTwo": { "desc": "two" } } 代码: 输出: 对象一对象二 我遵循了官方文件中的简单示例: 此外,我将响应包装在[]括号中,以查看响应是否必须在JSON数组中,但它只返回一个数组,其中第一个也是唯一的元素是“objectOneobjectTwo” 您的数据是

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

正在解码的有效载荷:

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

输出:

对象一对象二

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


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

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


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

您已经误诊了所发生的事情<代码>请求正在返回正确的词典。但是您正在将字典传递给
HttpResponse()
,而无需进一步处理。但是,
HttpResponse()
未设置为处理字典

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

内容
应该是迭代器或字符串。如果它是一个迭代器,它应该返回字符串,这些字符串将连接在一起形成响应的内容

从以下方面:

iter(d)

返回字典键上的迭代器。这是iter(d.keys())的快捷方式

如果要发送JSON数据,请改用。它被设置为正确编码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
decorator;当没有共享状态时,在类中包装静态视图函数没有什么意义。使用模块来创建名称空间

@Rawing:示例就在那里,它会产生错误的输出。但这是因为OP误解了Django,并指责
请求
。旁注:
staticmethod()
没有将
self
作为参数。传入的实际对象是Django
request
参数。
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'])