我正在尝试将系统参数解析为注入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
答案 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()}