如何在python中使用json.loads直接将变量名称作为dict键传递?

时间:2017-10-01 19:26:11

标签: python json load

我正在创建一个编写其他脚本的脚本,在从终端调用脚本时,参数作为JSON传递。

需要编写的脚本包含一个字典。 该字典中的一个关键值是变量名称(不是字符串)调用策略。

我的问题看起来像这样。

d = json.loads(sys.argv[2])

# d should looks like that
d = {
  "stopLossValue": 5,
  "strategy": strategy,
  "strategyTitle": "week5"
}

dic = """
parameterDict = {}
""".format(json.dumps(d, sort_keys=True, indent=4))

如果我将策略键值设置为字符串,则运行该脚本会返回一个消失的错误。

错误:

Traceback (most recent call last):
  File "updateCandleStrategy.py", line 11, in <module>
    d = json.loads(sys.argv[2])
  File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.4/json/decoder.py", line 361, in raw_decode
    raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 506 (char 505)

有没有一种简单的方法来实现我的目标?

由于

1 个答案:

答案 0 :(得分:1)

从命令行传递json字符串时,很有可能其中一个引号/ escape char被底层shell解释。

因此,这不是传递json字符串的可行/可靠方法。传递包含json数据的文件并读取它:

with open(sys.argv[2]) as f:
   d = json.load(f)

来自Windows控制台的示例,只打印第二个参数:

S:\python>foo.py ff "d = {"s":12,"d":15}"
d = {s:12,d:15}

报价已被删除。需要加倍他们。

在Linux终端上,将您的参数包装成单引号可以解决大多数情况,直到您偶然发现包含单引号的值...

为什么不使用getoptargparse来构建/解析正确的命令行,而不是传递字典?