Python终端传JSON参数触发JSONDecodeError双引号报错问题排查
命令行传JSON解析报错的核心原因
报错本质不是JSON本身格式不对,是命令行参数的传递机制导致Python根本没拿到你预期的完整JSON内容:
- 硬编码在Python代码里的JSON字符串,会被Python解释器直接完整加载,没有中间层做拆分解析,所以不会出现格式问题。
- 直接在终端敲命令拼接JSON的时候,终端本身会优先解析JSON里带特殊语义的符号:大括号、双引号这类在所有主流终端环境里都是有特定语法作用的分隔符,不会原封不动传给Python脚本。
- 对应你遇到的
line 1 column 2 (char 1)报错刚好能验证这个问题:Python实际拿到的sys.argv[1]大概率只剩了JSON开头的一个{符号——索引0的位置是{,索引1的位置没有后续内容,解析器自然找不到双引号包裹的JSON属性名,直接抛出解码错误。 - 额外注意你代码里本身存在逻辑死代码:你先判断
if len(sys.argv) < 3,又在这个分支内部嵌套判断if len(sys.argv) ==3,这个内层判断永远不会触发,本来想支持的「用户传入自定义下载目录」的功能完全跑不通。
可落地的解决方案
- 修正命令行传参的包裹方式,从根源避免终端拆分JSON内容:
- Linux/macOS终端、Windows cmd环境下,用单引号把完整JSON内容整体包裹,让终端把单引号内部的所有内容当一个整体参数传递,命令格式参考:
python DownloadFavoriteGIF.py '{"_state":{"favorites":[{"url":"test.gif"}]},"_version":2}' 自定义下载目录 - Windows PowerShell环境下,单引号包裹的传参在部分版本会出现转义折损,建议加参数终止符
--%,内部双引号用反斜杠转义,写法参考:python DownloadFavoriteGIF.py --% "{\"_state\":{\"favorites\":[{\"url\":\"test.gif\"}]},\"_version\":2}" 自定义下载目录
- Linux/macOS终端、Windows cmd环境下,用单引号把完整JSON内容整体包裹,让终端把单引号内部的所有内容当一个整体参数传递,命令格式参考:
- 更稳定的替代实现,避免超长JSON手动转义的问题:把收藏列表的JSON内容单独存成同目录下的文件,比如
favorites.json,代码里增加判断:如果传入的第一个参数是存在的文件路径,就直接读取文件内容做JSON解析,不用再拼超长字符串到命令行,完全规避终端转义的坑。 - 调试校验的小技巧:在读取
data = str(sys.argv[1])之后,临时加一行打印把实际拿到的内容输出出来,一眼就能看出终端是不是把完整JSON传过来了,不用对着解析错误猜问题。 - 顺手修复原有逻辑bug:把嵌套错误的参数判断逻辑理顺——先判断总参数数,超过3个就提示参数过多;参数数为3时取第二个参数作为自定义下载目录;参数数为2时自动定位系统默认下载目录,不要把判断条件写得自相矛盾。
内容的提问来源于stack exchange,提问作者lolozen
相关产品推荐
相关产品推荐

