flatten json object using jq

pnwntuvh  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(114)

下面是一个JSON对象:

{
    "id":1,
    "activities":[
       {"time":1659800397,"cities":["london","paris"],"type":1},
       {"time":1659800411,"cities":["rome"],          "type":2}
     ]
}

字符串
我想把它扁平化为下面的制表符分隔结构,也许使用jq
| ID|时间|城市|类型|
| --|--|--|--|
| 1 | 1659800397 |伦敦| 1 |
| 1 | 1659800397 |巴黎| 1 |
| 1 | 1659800411 |罗马| 2 |

tv6aics1

tv6aics11#

在深入到结构中之前,将值存储在变量中以供引用:

. as {$id} | .activities[] | .cities[] as $city
| [$id, .time, $city, .type] | @tsv

字符串
Demo
或者在分别迭代各个部分的同时将最后的部分添加到一起:

[.id] + (.activities[] | [.time] + (.cities[] | [.]) + [.type]) | @tsv


Demo
输出量:

2q5ifsrm

2q5ifsrm2#

我自己找到了解决方案;然而,我认为它可能对其他人有用:

jq -r '.id as $id | .activities[] | "\($id);\(.time);\(.type);\(.cities[])"' input.json

字符串
下面是代码的工作原理:
.id as $id提取“id”字段并将其分配给变量$id.activities[]迭代“activities”数组中的每个对象。"...\($id);\(.time);\(.type);\(.cities[])"使用我们定义的变量和字段,用提取的值构造所需的输出格式。

相关问题