【问题标题】:Passing json text as command line argument将 json 文本作为命令行参数传递
【发布时间】:2017-12-17 13:28:48
【问题描述】:

我正在尝试将以下 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/ 检查)。谢谢。

【问题讨论】:

  • 尽量不要在命令行参数中加引号
  • 刚试了一下,出现了意外的token错误。
  • 在下面查看我的解决方案
  • 您确定您使用的是 PowerShell,而不是常规的命令提示符之类的吗?您能否显示 PowerShell 会话的原始复制粘贴,从运行脚本的行到所有错误输出的结尾?
  • @user2357112 实际上它可以在普通终端上运行。不知道如果它有什么不同,我在 zsh 上运行。

标签: python json powershell


【解决方案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
  • 运行 3.6.1,对我不起作用。我会尝试调试它,看看它会把我带到哪里,非常感谢。
  • 嗯,很奇怪。我正在运行 3.6.0
  • @jacoblaw 谢谢,当我弄清楚时,我会在这里更新。最坏的情况明天我会在一个实际的基于 linux 的设备上尝试这个,看看它是否适用。据我所知,我所拥有的应该可以工作。
【解决方案2】:

所以我想通了。

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 头痛。
  • 这很烦人。很高兴你把它整理出来
  • 谢谢大家。是的,这完全是废话。我真的希望这不会发生在 osx 上,这就是运行这段代码的地方。
  • 在windows中对字符串使用addlashes
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 2015-04-11
  • 2016-02-07
  • 2016-10-10
  • 2023-02-10
  • 1970-01-01
相关资源
最近更新 更多