如何构建包含系统参数的json?

时间:2018-07-26 19:31:47

标签: python json system argparse

我正在尝试将系统参数解析为注入json的字符串。所以我有一个像这样设置的现有json构建方法:

{"field1" : value, "field2" : value, "system_args" : {args_here} }

我希望每个参数都显示为“ system_args”下的一个字段。因此,如果系统参数为“ grep hello”,则对应的json为:

{"field1" : value, "field2" : value, "system_args" : {arg_0:grep, arg_1:hello, full_arg: grep hello}}

我正在这样调用下面的方法(在单独的方法中):

info = {"field1" : value, "field2" : value, "system_args" : {self.build_arg_json}}

我写了以下方法:

def build_arg_json(self):
    data = []
    for index, item in enumerate(sys.argv[1:]):
        data.append({'arg_%s' % index : item})
    data.append({'full_arg': ' '.join([str(x) for x in sys.argv[1:]])})
    return json.dumps(data)

但是我得到了错误:

TypeError: set(['[{"arg_0": "grep"}, {"arg_1": "hello"}, {"full_arg": "grep hello"}]']) is not JSON serializable

1 个答案:

答案 0 :(得分:1)

停止考虑如何构建JSON,并考虑要进行JSON编码的值,并且事情通常要简单得多。

与您在示例中显示的最接近的有效内容是:

{'arg_0': 'grep', 'arg_1': 'hello', 'full_arg': 'grep hello'}

因此,您想要一个字典。不要试图建立一个列表,然后弄清楚如何将该列表转换为JSON字符串或dict等等。只是建立一个字典:

system_args = {}
for index, item in enumerate(sys.argv[1:]):
    system_args['arg_%s' % index] = item
system_args['full_arg'] = ' '.join([str(x) for x in sys.argv[1:]])

但是sys.argv已经是一个字符串列表,因此您可以使最后一行更加简单:

system_args['full_arg'] = ' '.join(sys.argv[1:])

最后,不要json.dumps。您想将其插入到另一本字典中,稍后再去json.dumps,因此只需将其作为字典返回即可:

return system_args

现在,由于它返回一个dict,它是您想要的system_args的值,因此您不必将其放在花括号中(它将变成一个单元素集);照原样使用它即可:

info = {"field1" : value, "field2" : value, "system_args" : self.build_arg_json()}