我想从一个给定的JSON中生成一个所有唯一的关键路径列表,每一个都在一行中。
例如,从这个输入JSON:
{
"results":[
{
"id":306,
"name":"First Company",
"branches":[
{
"id":4191,
"city":"San Francisco",
"customers":[
{
"id":446,
"name":"Big Tech 1"
},
{
"id":447,
"name":"Big Tech 2"
}
]
},
{
"id":4192,
"city":"Miami",
"customers":[
{
"id":448,
"name":"Insurance Tech 1"
},
{
"id":449,
"name":"Health Tech 2"
}
]
}
]
}
]
}
我想生成这样的输出:
results
results.id
results.name
results.branches
results.branches.id
results.branches.city
results.branches.customers
results.branches.customers.id
results.branches.customers.name
我在下面的命令行中挣扎,但它不起作用。
jq '
def path(k):
if k | type == "object":
reduce(.keys[] | path(.), k)
else:
[k]
;
.[] | path(".") | flatten | sort' example.json
有什么帮助吗?
3条答案
按热度按时间nfzehxib1#
您可以
map
paths
只包含strings
,然后使用unique
删除重复项,并通过提供join
项:Demo
要保持文档顺序(
unique
也会对数组进行排序),您可以通过使用连接路径作为(定义唯一的)对象字段来消除列表的重复数据:Demo
kmbjn2e32#
使用
paths
函数,过滤出对象键的数组索引,并收集唯一路径:093gszye3#
下面是一个输出以下内容的解决方案,以清楚地表明数组的位置:
这对于在操作JSON之前快速查看JSON的“形状”非常方便。
如果你在一个名为
show-shape.jq
(demo)的脚本中有以下代码:您可以按如下方式使用它:
范例:
请注意
x.b[].c
和x.d.e
的显示方式之间的区别。thuogh脚本的一个缺点是,它没有显示空数组的尾随
[]
: