如何仅显示不是jq版本1.3的数组或对象的顶级JSON条目?

时间:2019-08-07 19:05:47

标签: json jq

我有一个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版。

在此先感谢您的帮助。

2 个答案:

答案 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工具的创建者