这可能是一个愚蠢的问题,但我真的很困惑(我是新手)。我正在尝试制作一个接受 JSON 作为输入的 API,我正在使用 Flask。 API 采用 POST 方法,因此当请求出现时,它使用以下方法从正文中获取 JSON 数据data = requests.get_json()
我希望数据是一个字符串,因为如果我没记错的话,JSON 只不过是一个格式化的字符串。
所以,我做 data = json.loads(data)
但是,我的 flask 应用程序崩溃了,因为它说数据是字典而不是字符串。当然,我可以通过不使用 json.loads
来修复它但这只是困扰我,我想知道为什么我得到的是字典而不是字符串。
这是我发送测试请求的方式,这让我很困惑
1)
import requests
import pandas as pd
data = pd.read_csv('some.csv')
data = data.iloc[[0]].to_json(orient='records') // get the first row into json
res = requests.post(url, json=data) // I get a string in my Flask app.
import requests
data = {'name':'foo','age':99}
res = requests.post(url, json=data) // I get a dictionary in my Flask app.
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?
我不确定你是否能看到我的困惑。在某些情况下,我会得到一本字典,而在其他一些情况下,我会得到一个字符串。所以,我很困惑,不知道如何设计我的 API 和处理请求。预先感谢您的关注!
最佳答案
Pandas 的 DataFrame.to_json
返回一个字符串( str
)。因此,在这段代码中
data = df.to_json(orient='records')
res = requests.post(url, json=data)
data
实际上是 str
对象,并将其传递给 json
requests.post
的参数将再次将该字符串编码为 JSON。看response = requests.post(url, json={"foo": 1})
print(response.request.body)
response = requests.post(url, json='{"foo": 1}')
print(response.request.body)
会打印b'{"foo": 1}'
b'"{\\"foo\\": 1}"'
要正确发送 JSON 数据,您必须做的是data = df.to_json(orient='records')
response = requests.post(url, data=data.encode())
或实际转换 DataFrame
到 dict
data = df.to_dict(orient='records')
response = requests.post(url, json=data)
关于python - Flask 中的 JSON 数据是字符串还是字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62906887/