如何将转义的Json转换为常规Json或变量?

xeufq47z  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(77)

我正在使用Ansible从Bitbucket中提取JSON文件的内容。问题是内容是转义的JSON,所以我不能在变量中使用它或解析它,等等。下面是我从Bitbucket得到的一个例子:

{
    "json": {
      "lines": [
            {
            "text": "    \"AWS\": {"
            },
            {
            "text": "        \"S3\": {"
            },
            {
            "text": "            \"Bucket\": \"my-s3-bucket\","
            }
        ]
    }
}

以下是我尝试过的:

json_file.json.lines | map(attribute='text') | join('\n') | from_json

json_file.json.lines | map(attribute='text') | join('\n') | to_json

join()之后(在from/to_json之前),内容看起来像这样:

{\\n    \"AWS\": {\\n        \"S3\": {\\n            \"Bucket\": \"my-s3-bucket\"\\n            }\\n    }\\n  }

以上两个过滤器都不会返回可用的JSON。当我尝试访问JSON中的一个项目时,我会得到VARIABLE IS UNDEFINEDUnexpected failure during module execution: Expecting property name enclosed in double quotes
那么我如何才能做到这一点呢?

q3aa0525

q3aa05251#

我看到两个问题。

输入不是有效的JSON

如果我们提取示例中的文本,我们不会得到有效的JSON文档。我们得到:

"AWS": {"
        "S3": {"
            "Bucket": "my-s3-bucket"

它本身就是一个JSON文档的片段。为了测试一个解决方案,我们至少需要以下等式:

{
    "AWS": {"
        "S3": {"
            "Bucket": "my-s3-bucket"
        }
    }
}

过滤器无法生成有效的JSON

当你写:

json_file.json.lines | map(attribute='text') | join('\n') | to_json

你不能用换行符连接行。您正在使用文本双字符序列\n连接行。这会导致一个不是有效JSON的文档。
最简单的解决方案是在""上加入。

解决方案

考虑到以上两点,我们可以把这样的东西放在一起:

- hosts: localhost
  gather_facts: false
  vars:
    document: {
      "json": {
        "lines": [
              {
              "text": "{"
              },
              {
              "text": "    \"AWS\": {"
              },
              {
              "text": "        \"S3\": {"
              },
              {
              "text": "            \"Bucket\": \"my-s3-bucket\""
              },
              {
                "text": "}}}"
                }
          ]
      }
    }

  tasks:
    - set_fact:
        json: "{{ document.json.lines | map(attribute='text') | join('') }}"

    - debug:
        msg: "Bucket: {{ json.AWS.S3.Bucket }}"

其产生作为输出:

PLAY [Testing] *****************************************************************

TASK [set_fact] ****************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "Bucket: my-s3-bucket"
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

相关问题