将JSON文本作为命令行参数传递

5

我正在尝试将以下JSON文本传递到我的Python代码中。

{"platform": "android", "version": "6.0.1"}

我的代码如下所示。

import sys
import json
data = json.loads(sys.argv[1])
print(str(data))

在运行以下命令时,请使用Windows 10 PowerShell环境:
python jsonTest.py '{"platform": "android", "version": "6.0.1"}'

我得到了以下内容:
Traceback (most recent call last):
File "jsonTest.py", line 3, in <module>
data = json.loads(sys.argv[1])
File "C:\Users\Rishabh Bhatnagar\AppData\Local\Programs\Python\Python36-
32\lib\json\__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "C:\Users\Rishabh Bhatnagar\AppData\Local\Programs\Python\Python36-
32\lib\json\decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\Rishabh Bhatnagar\AppData\Local\Programs\Python\Python36-
32\lib\json\decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double 
quotes: line 1 column 2 (char 1)

据我所知,我拿到了我的代码,并正确地传递了JSON文本。但我无法弄清楚我做错了什么。我知道JSON文本是有效的(使用https://jsonlint.com/进行了检查)。谢谢。

尝试在命令行参数中不添加引号。 - jacoblaw
刚试了一下,出现了意外的标记错误。 - Rishi_B
你确定你使用的是PowerShell,而不是普通的命令提示符或其他东西吗?你能展示一下你的PowerShell会话的原始复制粘贴内容,从运行脚本的那一行到所有错误输出结束为止吗? - user2357112
@user2357112 实际上它在普通终端上可以运行。不知道是否有区别,我正在运行zsh。 - cs95
面向对象,Windows 没有注册。 - cs95
显示剩余4条评论
3个回答

8
所以我弄清楚了。
sys.argv[1]

上面的代码将我的Json文本中的引号删除了。
{"platform": "android", "version": "6.0.1"}

转换为

{platform: android, version: 6.0.1}

我的解决办法是按照以下方式运行它。
Python jsonTest.py '{\"platform\": \"android\", \"version\": \"6.0.1\"}'

我会尝试寻找更好的方法,但今天我已经完成了。


是的,典型的Windows头疼问题。 - darksky
1
真让人烦恼。很高兴你解决了它。 - jacoblaw
谢谢大家。是的,那完全是胡说八道。我真的希望这不会发生在OSX上,因为这段代码将在那里运行。 - Rishi_B
1
在Windows中使用addslashes将字符串转义。 - R T

1
import sys
import json
data = json.loads(sys.argv[1].replace("'", '"'))
print(str(data))

这对我来说似乎有效,在调用时使用Python 3.6和python jsonTest.py“{'platform': 'android', 'version': '6.0.1'}”

使用发布的命令和代码从PowerShell调用,它可以在Windows 7、Python 3.6和PowerShell中运行。 - jacoblaw
运行3.6.1对我来说不起作用。我会尝试调试一下,看看能带我到哪里,非常感谢。 - Rishi_B
嗯,奇怪。我正在运行3.6.0版本。 - jacoblaw
@jacoblaw 谢谢,我弄明白了会在这里更新。最坏的情况是明天我会去尝试在实际的基于Linux的设备上运行并查看是否有效。据我所知,我所拥有的应该可以工作。 - Rishi_B

0
Windows 11,Python 3.11:
import json
import sys

cmdstr = dict(json.loads(sys.argv[1].replace("'", '"'))) 
print(json.dumps(cmdstr))

输入:

python test.py "{'First': 'foo', 'Second': 'bar', 'Third': 'baz'}"

输出:

{"First": "foo", "Second": "bar", "Third": "baz"}

比尔的盒子喜欢它!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接