我有一个JSON结构,我只想打印简单类型的条目,例如不是数组或对象。
样本输入:
{
"person": {
"address": {
"city": "NY",
"street": "Wall Street"
},
"god": true,
"nicks": [
"Lar",
"L",
"Yo"
],
"name": "Larry",
"id": 1
}
}
预期输出:
"god": true,
"name": "Larry",
"id": 1
我对此尝试了许多不同的变体,但没有用:
jq '.person | with_entries(.) | select(map(type) != "array" and map(type) != "object")'
请注意,我使用的是jq 1.3版。
在此先感谢您的帮助。
答案 0 :(得分:3)
使用with_entries
调用实际上并没有执行任何操作。但是您可能应该在那里过滤。筛选值类型既不是数组也不是对象的条目。
.person | with_entries(select(.value | type | . != "array" and . != "object"))
如果您使用的是jq的最新版本,则可以使用scalars
内置过滤器来有效地执行相同的操作。
.person | with_entries(select(.value | scalars))
答案 1 :(得分:0)
在这里很有意思,即使问题专门针对jq,使用另一个用于JSON的unix实用程序- jtc
也可以实现与JSON相同类型的操作,这是基于walk-path
的工具。
您的询问将如下所示:
bash $ <file.json jtc -w'<>a:' -l
"city": "NY"
"street": "Wall Street"
"god": true
"id": 1
"name": "Larry"
"Lar"
"L"
"Yo"
bash $
-它会在输入中查找并转储所有原子(即搜索后缀a
所代表的)JSON值。请注意,某些值没有标签就转储了-因为它们来自数组。
仅打印具有标签(即驻留在对象中)的原子,则查询看起来稍微复杂一点:
bash $ <file.json jtc -w'<V>a:[-1]<>o<V>s' -l
"city": "NY"
"street": "Wall Street"
"god": true
"id": 1
"name": "Larry"
bash $
-仍然找到所有原子,将它们存储在var V
(<V>a:
)中,然后在JSON([-1]
)中提升1级,并确保它是一个对象({{ 1}}),如果是,则再次在该对象中找到存储的值(<>o
)。
-仅转储数组中的所有值,然后将搜索后缀<V>s
替换为o
-我将比所有数组进行验证:
i
最后,要仅在人体内转储原子而不进行递归,那么就像这样:
bash $ <file.json jtc -w'<V>a:[-1]<>i<V>s' -l
"Lar"
"L"
"Yo"
bash $
-即bash $ <file.json jtc -w'[person]><a:' -l
"god": true
"id": 1
"name": "Larry"
bash $
是一种递归搜索类型,而<..>
是非递归搜索类型(即在当前选定的JSON元素内)
PS>披露:我是>..<
-用于JSON操作的shell cli工具的创建者