gpt4 book ai didi

python - Flask 中的 JSON 数据是字符串还是字典?

转载 作者:行者123 更新时间:2023-12-03 23:05:36 32 4
gpt4 key购买 nike

这可能是一个愚蠢的问题,但我真的很困惑(我是新手)。我正在尝试制作一个接受 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())
    或实际转换 DataFramedict
    data = df.to_dict(orient='records')
    response = requests.post(url, json=data)

    关于python - Flask 中的 JSON 数据是字符串还是字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62906887/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com