Python JSON数据是Flask中的字符串还是字典?
这可能是一个愚蠢的问题,但我真的很困惑(我是一个新手)。我正在尝试制作一个接受JSON作为输入的API,我正在使用Flask。API采用POST方法,因此当出现请求时,它使用POST方法从主体获取JSON数据Python JSON数据是Flask中的字符串还是字典?,python,json,dictionary,flask,python-requests,Python,Json,Dictionary,Flask,Python Requests,这可能是一个愚蠢的问题,但我真的很困惑(我是一个新手)。我正在尝试制作一个接受JSON作为输入的API,我正在使用Flask。API采用POST方法,因此当出现请求时,它使用POST方法从主体获取JSON数据 data=requests.get\u json() 我希望数据是一个字符串,因为如果我没有弄错的话,JSON只不过是一个格式化的字符串 所以,我确实data=json.loads(data),但我的flask应用程序崩溃了,因为它说数据是字典而不是字符串。当然,我可以通过不使用json.
data=requests.get\u json()
我希望数据是一个字符串,因为如果我没有弄错的话,JSON只不过是一个格式化的字符串
所以,我确实data=json.loads(data)
,但我的flask应用程序崩溃了,因为它说数据是字典而不是字符串。当然,我可以通过不使用json.loads
来修复它,但这让我很困扰,我想知道为什么我得到的是字典而不是字符串
下面是我发送测试请求的方式,这让我很困惑
(一)
我不确定你是否能看到我的困惑。在某些情况下,我会得到一本字典,在另一些情况下,我会得到一个字符串。因此,我感到困惑,不知道如何设计API和处理请求。
提前感谢您的关注 Pandas'返回一个字符串(str
)。因此,在本规范中
data=df.to_json(orient='records')
res=requests.post(url,json=data)
data
实际上是一个str
对象,并将其传递给请求的json
参数。post
将再次将该字符串编码为json。看
response=requests.post(url,json={“foo”:1})
打印(响应.请求.正文)
response=requests.post(url,json='{“foo”:1}')
打印(响应.请求.正文)
将打印
b'{"foo": 1}'
b'"{\\"foo\\": 1}"'
要正确发送JSON数据,您必须做的是
data=df.to_json(orient='records')
response=requests.post(url,data=data.encode())
或者实际将数据帧
转换为dict
data=df.to_dict(orient='records')
response=requests.post(url,json=data)
JSON对象只是python中的一个字典,flask是python编写的框架因此,json库公开了将数据写入文件的dump()方法。还有一个dumps()方法(发音为“dump-s”)用于写入Python字符串。
简单的Python对象根据相当直观的转换转换转换为JSON。
Python JSON
dict object
list,tuple array
str string
int,long,float number
True true
False false
None null
因此,根据从json中提取的内容,python变量会相应地进行操作,
与第一种情况类似
data=data.iloc[[0]]。to_json(orient='records')
data变量只是一个字符串,这就是为什么
res=requests.post(url,json=data)
在这里显示这种行为在第二种情况下
data={'name':'foo','age':99}
it's dictionary这是为什么
res=requests.post(url,json=data)
显示这种行为pandas.DataFrame.to_json
返回字符串。data=json.load(data)
接受字符串变量(data)JSON代表JavaScript对象表示法——一种按照特定表示法将JavaScript对象序列化为字符串的方法。简而言之,JSON实际上是一个带有特定编码的字符串。对于名为json
的方法应该返回或接受什么作为参数,您在这里遇到的一些API有不同的观点,您的问题实际上在于如何请求。post
处理json
参数-它将在提交请求之前隐式调用类似json.dumps的内容,因此您的第一个示例是to_json
输出,它已经是一个字符串,获取双重编码为包含基础对象(或dict)的JSON编码的JSON字符串类型。因此,当它到达接收该有效负载的端点时,它将正确解码并将其视为一个字符串(由to_JSON
生成的JSON编码的有效负载)。我想补充一点,requests.post
的JSON
参数更适合dict
类型,而data
参数用于已最终确定为预期形式的有效负载。事实上,我编辑了我的答案,添加了另一个解决方案,通过将DataFrame
转换为dict来正确使用json
参数。
const xhr = new XMLHttpRequest();
const json = {'name':'foo','age':99};
xhr.open("POST",url);
xhr.setRequestHeader("Content-Type","application/json");
xhr.send(JSON.stringify(json)); // Though stringified, I get a dictionary in my Flask app. Why?
b'{"foo": 1}'
b'"{\\"foo\\": 1}"'
Python JSON
dict object
list,tuple array
str string
int,long,float number
True true
False false
None null