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

Python Requests修改POST请求payload后报JSON解析意外token错误求助

报错根源
  • 直接传字典给data参数触发Unexpected token P in JSON at position 0:requests默认会把data参数传入的字典编码为form-urlencoded格式的表单串,结构类似PortfolioItem=xxx&expiresAt=xxx,整个请求体不是合法JSON格式,服务端解析时读到的第一个字符就是表单串里PortfolioItem的首字母P,直接触发解析错误。
  • 用str()转字典后传参触发Unexpected token ' in JSON at position 0:Python的str()方法对字典的默认序列化规则是用单引号包裹字符串键和值,转换结果类似{'PortfolioItem': {'expiresAt': 'xxx'}},完全不符合JSON规范“字符串必须使用双引号包裹”的要求,解析器读到请求体开头的单引号就会判定格式非法。
  • 手动拼接字符串的适配问题:手动拼接字符串时很难精准区分字段类型边界,容易把需要传整型的字段误拼成带引号的字符串值,还会遗漏特殊字符的转义逻辑,维护成本极高。
可行解决方案

方案1:使用内置json参数传字典(推荐)

requests库原生支持直接传入Python字典作为JSON请求体,不需要手动做序列化:

import requests

# 按接口要求初始化字典结构,动态给字段赋值
payload = {
    "PortfolioItem": {
        "expiresAt": "2024-12-31T23:59:59Z",
        "localAmount": 129,  # 直接传入整型数值,无需额外处理
        "skuUuid": "你的sku对应值"
    }
}

# 将字典直接传递给json参数发起请求
response = requests.post("你的目标接口地址", json=payload)

该方式下requests会自动完成两个适配操作:使用标准JSON规则序列化字典(统一使用双引号包裹字符串、保留整型/布尔型等数值类型的原始结构);自动在请求头中添加Content-Type: application/json,完全匹配服务端的解析要求。

方案2:手动序列化字典后通过data参数传值

如果需要沿用原Postman导出的data传参逻辑,不要使用str()转换字典,需调用标准json模块完成序列化后再传入:

import requests
import json

payload = {
    "PortfolioItem": {
        "expiresAt": "2024-12-31T23:59:59Z",
        "localAmount": 129,
        "skuUuid": "你的sku对应值"
    }
}

# 调用json模块序列化得到合法JSON字符串
serialized_payload = json.dumps(payload)
# 手动补充对应请求头
request_headers = {"Content-Type": "application/json"}

response = requests.post("你的目标接口地址", data=serialized_payload, headers=request_headers)

该方式生成的请求体结构和原Postman导出的序列化JSON完全一致,会自动保留所有动态赋值字段的类型,不会出现数值被误转成字符串的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 02:36:01