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