您好我有以下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)]'
有意义吗?
答案 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
,则可以扩展简单的逻辑