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

标签 python json dictionary flask python-requests

这可能是一个愚蠢的问题,但我真的很困惑(我是新手)。我正在尝试制作一个接受 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/

    相关文章:

    python - 在 python 中循环列表并使用 dict 理解创建字典的正确方法是什么?

    python - 改变RNN中的 'temperature'生成文本

    python - 大多数忽略输出的pythonic方式

    如果成员丢失,C# DataContractJsonSerializer ReadObject 不会抛出错误

    javascript - Vue JS 在 console.log 上返回 [Object object] 并在 JSON.parse 上返回未定义

    c++ - 将类插入 STL 映射时出现“没有匹配的调用函数”错误

    Python 类之间的异步通信

    python - 使用 where 子句中的变量从 sqlite3 读取 pandas 数据帧

    java - StAXON - 当 autoPrimitive 为 true 时,强制将特定值设置为 String

    python - 如何在json中转储压缩字符串?