Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ansible将转义的json字符串转换为json_Python_Json_Ansible_Jmespath - Fatal编程技术网

Python ansible将转义的json字符串转换为json

Python ansible将转义的json字符串转换为json,python,json,ansible,jmespath,Python,Json,Ansible,Jmespath,我有一个Ansible输出,看起来像这样,但是在没有转义字符串的情况下很难将其解析为JSON { "msg": [ "{", "\t\"inprog\" : [", "\t\t{", "\t\t\t\"desc\" : \"conn174272\",", "\t\t\t\"threadId\" : \"139899377280768\",", "\t\t\t\"connectionId\" :

我有一个Ansible输出,看起来像这样,但是在没有转义字符串的情况下很难将其解析为JSON

{
    "msg": [
        "{",
        "\t\"inprog\" : [",
        "\t\t{",
        "\t\t\t\"desc\" : \"conn174272\",",
        "\t\t\t\"threadId\" : \"139899377280768\",",
        "\t\t\t\"connectionId\" : 174272,",
        "\t\t\t\"client\" : \"127.0.0.1:43365\",",
        "\t\t\t\"active\" : true,",
        "\t\t\t\"opid\" : 35571992,",
        "\t\t\t\"secs_running\" : 0,",
        "\t\t\t\"microsecs_running\" : NumberLong(16),",
        "\t\t\t\"op\" : \"command\",",
        "\t\t\t\"ns\" : \"admin.$cmd\",",
        "\t\t\t\"query\" : {",
        "\t\t\t\t\"currentOp\" : 1",
        "\t\t\t},",
        "\t\t\t\"numYields\" : 0,",
        "\t\t\t\"locks\" : {",
        "\t\t\t\t",
        "\t\t\t},",
        "\t\t\t\"waitingForLock\" : false,",
        "\t\t\t\"lockStats\" : {",
        "\t\t\t\t",
        "\t\t\t}",
        "\t\t}",
        "\t],",
        "\t\"ok\" : 1",
        "}"
    ]
}
理想情况下,输出应类似于:

{
    "inprog": [
        {
            "desc": "conn5404",
            "threadId": "139922277680896",
            "connectionId": 5404,
            "client": "127.0.0.1:50726",
            "active": true,
            "opid": 225819,
            "secs_running": 0,
            "microsecs_running": NumberLong(20),
            "op": "command",
            "ns": "admin.$cmd",
            "query": {
                "currentOp": 1
            },
            "numYields": 0,
            "locks": {
            },
            "waitingForLock": false,
            "lockStats": {
            }
        }]
}
我试过JMESPath,但没有成功。任何提示都会有帮助。最近的尝试是

- name: get ops
  shell:
    cmd: mongo --eval  "db.currentOp()"
  register: currentOp

- debug:
    msg: "{{ currentOp.stdout_lines[2:] | to_json }}"
这导致:

{
    "msg": "[\"{\", \"\\t\\\"inprog\\\" : [\", \"\\t\\t{\", \"\\t\\t\\t\\\"desc\\\" : \\\"conn174318\\\",\", \"\\t\\t\\t\\\"threadId\\\" : \\\"139899381491456\\\",\", \"\\t\\t\\t\\\"connectionId\\\" : 174318,\", \"\\t\\t\\t\\\"client\\\" : \\\"127.0.0.1:43374\\\",\", \"\\t\\t\\t\\\"active\\\" : true,\", \"\\t\\t\\t\\\"opid\\\" : 35579590,\", \"\\t\\t\\t\\\"secs_running\\\" : 0,\", \"\\t\\t\\t\\\"microsecs_running\\\" : NumberLong(15),\", \"\\t\\t\\t\\\"op\\\" : \\\"command\\\",\", \"\\t\\t\\t\\\"ns\\\" : \\\"admin.$cmd\\\",\", \"\\t\\t\\t\\\"query\\\" : {\", \"\\t\\t\\t\\t\\\"currentOp\\\" : 1\", \"\\t\\t\\t},\", \"\\t\\t\\t\\\"numYields\\\" : 0,\", \"\\t\\t\\t\\\"locks\\\" : {\", \"\\t\\t\\t\\t\", \"\\t\\t\\t},\", \"\\t\\t\\t\\\"waitingForLock\\\" : false,\", \"\\t\\t\\t\\\"lockStats\\\" : {\", \"\\t\\t\\t\\t\", \"\\t\\t\\t}\", \"\\t\\t}\", \"\\t],\", \"\\t\\\"ok\\\" : 1\", \"}\"]"
}

其思想是从输出创建一个新的json数组。例如,
[{“secs_running”:123,“opid”:1232342}]

您有一个字符串列表,每行一个

在壳体中,连接至jq的管道:

jq-r'.msg[]
…或者您可以将数据作为stdin提供给以下Python:

导入系统,json 对于json.load(sys.stdin).msg中的行: 打印(行)
mongo--quiet--eval“print(JSON.stringify(db.currentOp())”解决了这个问题。
因为mongo shell是一个Javascript交互式shell
JSON.stringify
神奇地返回了JSON响应

一般来说,一个好的问题也会显示您尝试了什么以及它是如何失败的(这是错误还是不正确的输出)。最新尝试使用ansible filter
更新了问题,您可以尝试
join()
ing首先列出行。谢谢,但这不起作用,因为ansible play是从yml任务文件运行的。您可以发布ansible文件的一部分,以便我们可以查看数据的源和预期目标吗?更新了文件中更多任务的描述。目标是从输出中创建一个新的JSON如果您的初始问题回答正确,那么如果没有足够广泛的范围来解决您的实际问题,则通常更适合打开一个新问题,而不是将之前的问题变形为新形式。