如何使用jq压缩字符串编码的json?

时间:2017-03-21 17:19:27

标签: jq

您好我有以下json。

[
    {
        "myfield1": "foo",
        "myfield2": "{\"field1\":6366987, \"field2\":5501072}"
    },
    {
        "myfield1": "bar",
        "myfield2": "{\"field1\":123456, \"field2\":123456}"
    }
]

想得到......

[
    {
        "myfield1": "foo",
        "field1": 6366987,
        "field2": 5501072 
    },
    {
        "myfield1": "foo",
        "field1": 123456,
        "field2": 123456 
    },
]

到目前为止,我得到了这个......

jq' [。[0] | {myfield1:.myfield1,myfield2:.myfield2 | fromjson}]'

但这意味着我必须指定每个json字段加上它不会使json编码的字符串变平。

编辑:

我想我得到了这个...

jq' [。[0] | with_entries(select(.key!=" myfield2"))+(。myfield2 | fromjson)]'

有意义吗?

2 个答案:

答案 0 :(得分:1)

你是对的,解决方案涉及fromjson,但更简单,更直接,更有效的方法如下:

map( { myfield1 } + ( .myfield2 | fromjson ) )

如果您想保留除#34; myfield2"以外的所有字段,请考虑:

map( del(.myfield2) + ( .myfield2 | fromjson ) )

答案 1 :(得分:0)

我使Terraform输出,AWS cli输出和AWS日志可读的技巧也将在这里起作用。

@peak与fromjson一起走在正确的道路上,但是map的使用是特定于任务的。我建议使用walk

## Input:
jq 'walk(if type == "string" and .[0:2] == "{\"" then .=(.|fromjson) else . end)'<<EOF
[
    {
        "myfield1": "foo",
        "myfield2": "{\"field1\":6366987, \"field2\":5501072}"
    },
    {
        "myfield1": "bar",
        "myfield2": "{\"field1\":123456, \"field2\":123456}"
    }
]
EOF

## Output:
[
  {
    "myfield1": "foo",
    "myfield2": {
      "field1": 6366987,
      "field2": 5501072
    }
  },
  {
    "myfield1": "bar",
    "myfield2": {
      "field1": 123456,
      "field2": 123456
    }
  }
]

这假定所有嵌入式JSON是缩小的字典。如果需要支持列表,空格或完整的RFC7159

,则可以扩展简单的逻辑