如何在Python中将JSON转为x-www-form-urlencoded?编码不符报错
解决Python中JSON转x-www-form-urlencoded与Postman不一致的问题
先看你代码里的几个明显问题,这些正是导致编码结果不对、请求报错的核心原因:
你的代码存在的错误
json.dump('json code')用法完全错误:json.dump()是用来将Python对象写入文件的,需要传入对象和文件句柄两个参数;如果要把Python对象转成JSON字符串,应该用json.dumps()。而且你这里传的是字符串'json code',这显然不是你实际要处理的目标数据。urlencode(json.loads(j), encode='utf-8')有两处问题:一是urlencode的编码参数是encoding而非encode;二是如果你已经有Python字典,完全不需要先转成JSON字符串再解析回字典——这属于多余操作,还可能引入不必要的编码异常。- 错误信息里的
Unexpected token '说明编码后的内容出现了未转义的单引号,这大概率是你错误处理JSON字符串导致的格式混乱。
正确的处理方式
从Postman生成的qs参数(type=form&result_options=%7B%22fieldset%22%3A%5B%22count%22%5D%7D)能看出,Postman的逻辑是:把嵌套的JSON结构作为单个字段的字符串值,再对整个键值对字典进行url编码。
举个具体的实现例子,假设你的原始数据是这样的Python字典:
data = { "type": "form", "result_options": { "fieldset": ["count"] } }
正确的转换步骤如下:
- 把嵌套的
result_options值转成标准JSON字符串 - 用
urlencode对整个键值对字典进行编码
代码实现:
import json from urllib.parse import urlencode # 原始数据(Python字典) data = { "type": "form", "result_options": { "fieldset": ["count"] } } # 将嵌套结构转为JSON字符串 data["result_options"] = json.dumps(data["result_options"]) # 执行url编码 encoded_data = urlencode(data, encoding='utf-8') print(encoded_data)
运行这段代码会输出:
type=form&result_options=%7B%22fieldset%22%3A%5B%22count%22%5D%7D
这和Postman生成的qs完全一致,用这个结果发送POST请求就不会再出现报错了。
补充:如果原始数据是JSON字符串
如果你的输入是JSON字符串而非Python字典,可以先解析成字典再按上面的步骤处理:
import json from urllib.parse import urlencode # 原始JSON字符串 json_str = '{"type": "form", "result_options": {"fieldset": ["count"]}}' data = json.loads(json_str) # 后续步骤和上面一致 data["result_options"] = json.dumps(data["result_options"]) encoded_data = urlencode(data, encoding='utf-8')
内容的提问来源于stack exchange,提问作者user3085459
相关产品推荐
相关产品推荐

