使用jq列出JSON对象中的键
我有一个由科学仪器创建的层次结构很深的JSON对象,因此该文件有点大(1.3MB),人们不容易读取。我想为JSON对象获得一个键列表,直到某个深度。例如,给定这样的输入对象使用jq列出JSON对象中的键,json,command-line,jq,Json,Command Line,Jq,我有一个由科学仪器创建的层次结构很深的JSON对象,因此该文件有点大(1.3MB),人们不容易读取。我想为JSON对象获得一个键列表,直到某个深度。例如,给定这样的输入对象 { "acquisition_parameters": { "laser": { "wavelength": { "value": 632, "units": "nm" }
{
"acquisition_parameters": {
"laser": {
"wavelength": {
"value": 632,
"units": "nm"
}
},
"date": "02/03/2525",
"camera": {}
},
"software": {
"repo": "github.com/username/repo",
"commit": "a7642f",
"branch": "develop"
},
"data": [{},{},{}]
}
我想这样的输出
{
"acquisition_parameters": [
"laser",
"date",
"camera"
],
"software": [
"repo",
"commit",
"branch"
]
}
这主要是为了能够枚举JSON对象中的内容。处理完仪器中的JSON对象后,开始发散:例如,一些对象可能具有类似
.frame.cross_section.stats.fwhm的字段,而其他对象可能具有.sample.species
,因此,能够在命令行上查询JSON对象将非常方便。鉴于您的目的,您可以更轻松地使用路径
内置来列出输入中的所有路径,然后在所需深度处截断:
$ echo '{"a":{"b":{"c":{"d":true}}}}' | jq -c '[paths|.[0:2]]|unique'
[["a"],["a","b"]]
以下内容应该完全符合您的要求
jq '[(keys - ["data"])[] as $key | { ($key): .[$key] | keys }] | add'
这将使用上述输入提供以下输出:
{
"acquisition_parameters": [
"camera",
"date",
"laser"
],
"software": [
"branch",
"commit",
"repo"
]
}
下面是另一个变体,它使用reduce和setpath,假设您有一组要检查的顶级键:
. as $v
| reduce ("acquisition_parameters", "software") as $k (
{}; setpath([$k]; $v[$k] | keys)
)