You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tornado handler调用json.loads(request.body)返回字符串问题如何解决

问题根因

requests库post方法的json参数原生支持自动将传入的Python对象序列化为JSON请求体,同时自动添加Content-Type: application/json请求头。你的代码中先手动调用json.dumps(x)把字典转成了JSON字符串,再将该字符串传给json参数,会触发requests对这个字符串做二次JSON序列化,最终发送的请求体就是两层转义的格式:外层多了一层引号包裹,也就是你观察到的b'"{\"inputs\":...}"'结构。因此服务端第一次json.loads只能解析出内层的JSON字符串,需要再解析一次才能拿到字典。

修复方案

任选以下任意一种方式修改请求代码即可:

方案1(推荐):直接传字典给json参数

去掉手动序列化步骤,由requests自动完成JSON序列化:

with open("ee", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read())
x = {"inputs": {"key1": encoded_string.decode("utf-8")}}
# 直接将字典对象传给json参数
<request_session>.post(<HOST>, json=x)

方案2:手动序列化时改用data参数

如果你需要自行控制序列化逻辑,就不要使用json参数,改为通过data参数传递序列化后的字符串,同时手动指定请求头:

with open("ee", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read())
x = {"inputs": {"key1": encoded_string.decode("utf-8")}}
# 手动序列化时使用data参数,同步指定Content-Type请求头
<request_session>.post(<HOST>, data=json.dumps(x), headers={"Content-Type": "application/json"})

修改后服务端调用一次json.loads(request.body)就能直接得到字典类型的解析结果。


内容的提问来源于stack exchange,提问作者Sid Anand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:06:03