代码之家  ›  专栏  ›  技术社区  ›  jeremywat

如何将转义Json转换为正则Json或变量?

  •  0
  • jeremywat  · 技术社区  · 2 年前

    我使用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 UNDEFINED 或者我得到 Unexpected failure during module execution: Expecting property name enclosed in double quotes

    那么我该如何做到这一点呢?

    1 回复  |  直到 2 年前
        1
  •  3
  •   larsks    2 年前

    我看到两个问题。

    输入不是有效的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