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
相关产品推荐
相关产品推荐

