在Python中为ansible回调插件合并两个json字符串的更好方法

2024-10-02 00:30:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个插件,将日志结果作为一个json文件返回给ansible playbook。在

我对python不是很熟悉,但我尝试了一些似乎有效的方法:

def json_log(res, host):
    if type(res) == type(dict()):
        if 'verbose_override' not in res:
          host_json = JSONEncoder().encode({'host':host})
          result_json = JSONEncoder().encode(res)
          combined_json = host_json + result_json
          combined_json = combined_json.replace("}{", ',')
          print(combined_json)

host_json将类似于:{"host": "centos65"}

result_json可能是这样的:{"cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584", "stdout": "Hello World", "changed": true, "start": "2014-08-01 19:32:38.707510", "delta": "0:00:00.007074", "stderr": "", "rc": 0, "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}

所以我选择了蛮力路径,将字符串组合起来并删除了}{它得到了它们连接的地方,因此它将采用我想要的格式作为有效的json:

{"host": "centos65","cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584", "stdout": "Hello World", "changed": true, "start": "2014-08-01 19:32:38.707510", "delta": "0:00:00.007074", "stderr": "", "rc": 0, "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}

所以现在我只是将这两个字符串混搭在一起,然后用逗号替换join,有没有更聪明的方法将它们与json开头的主机部分结合起来?在


Tags: 方法echojsonhosthelloworldiftype
2条回答

由于这两个词典都是词典,因此可以用另一个词典更新其中一个词典。例如:

>>> a = {"host": "centos65"}

>>> b = {"cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584", "stdout": "Hello World", "changed": True, "start": "2014-08-01 19:32:38.707510", "delta": "0:00:00.007074", "stderr": "", "rc": 0, "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}

>>> a.update(b)
>>> a
{'cmd': 'echo "Hello World" ', 'end': '2014-08-01 19:32:38.714584', 'stdout': 'Hello World', 'changed': True, 'rc': 0, 'start': '2014-08-01 19:32:38.707510', 'host': 'centos65', 'stderr': '', 'delta': '0:00:00.007074', 'invocation': {'module_name': 'shell', 'module_args': 'echo "Hello World"'}}
>>> a["host"]
'centos65'
>>> a["cmd"]
'echo "Hello World" '
>>> 
res = {"cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584", "stdout": "Hello World", "changed": True, "start": "2014-08-01 19:32:38.707510", "delta": "0:00:00.007074", "stderr": "", "rc": 0, "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}

def json_log(res, host):
    if isinstance(res,dict) and 'verbose_override' not in res:  
           res.update({"host": host})        
           combined_json  = JSONEncoder().encode(res)
           print(combined_json)

In [73]: json_log(res,"centos")
{"cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584", "stdout": "Hello World", "changed": true, "rc": 0, "start": "2014-08-01 19:32:38.707510", "host": "centos", "stderr": "", "delta": "0:00:00.007074", "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}

您可以用另一个dict的内容更新dict,唯一的问题是如果您有重复的键并且不希望覆盖这些值。在

相关问题 更多 >

    热门问题