Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python JSON数据是Flask中的字符串还是字典?_Python_Json_Dictionary_Flask_Python Requests - Fatal编程技术网

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

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.

这可能是一个愚蠢的问题,但我真的很困惑(我是一个新手)。我正在尝试制作一个接受JSON作为输入的API,我正在使用Flask。API采用POST方法,因此当出现请求时,它使用POST方法从主体获取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