将JSON字符串作为Python脚本参数传递会导致引号问题

11
我希望编写一个脚本,接收一个包含JSON数据的字符串作为唯一参数,并(为了简化)打印出某些内容。
import argparse
import json

parser = argparse.ArgumentParser(description='json load and print')
parser.add_argument('-i','--inputstring', help='Input String in JSON format',required=True)
args = parser.parse_args()

inp = parser.parse_args()

data = json.loads(inp)

print(data['Employees'])

当我从命令行运行此代码时,由于我使用双引号将字符串包装起来,这导致匹配JSON中的双引号出现错误:

python myscript.py -i "{ "Employees": "name name"}"
Unrecognized arguments Employees...

如果我把 JSON 中的双引号换成单引号,JSON 解析器将无法工作。
如何解决这个问题?
3个回答

10
如果您更改输入变量的分配方式,则代码将按预期工作。请更改此行:
inp = parser.parse_args()

为了

inp = args.inputstring

parse_args() 返回一个 argparse.Namespace 对象,因此在将其传递给解析器之前,您需要从该对象中检索输入。此外,您需要在 shell 命令中转义双引号。我使用上述更改运行以下命令可获得预期输出:

python myscript.py -i "{ \"Employees\": \"name name\"}"

4

在JSON中,应该对内部的双引号进行转义:

python myscript.py -i "{ \"Employees\": \"name name\"}"

但是看你的代码,还有几个原因可能导致它无法工作:
  1. 你将 args 和 inp 赋了相同的值,即函数调用的返回值: parser.parse_args()。也许你想把 inp 的值赋给 args.inputstring。

  2. 你将问题标记为 python2,但是看你的 print(...) 语句,它似乎是针对 python3 编写的。


0
你应该用单引号替换双引号:
python myscript.py -i "{ 'Employees': 'name name'}"

1
在解析参数之后,仍需要额外的步骤将单引号替换为双引号才能解析JSON。 - Robbie Capps

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