使用JQ提取数据

时间:2019-08-20 16:38:52

标签: json dictionary jq

我正在尝试使用jq从包含特定值的JSON字段中提取数据。

这是我正在使用的JSON:

{
  "thing1": {
    "a": false,
    "b": true,
    "c": false,
    "d": false
  },
  "thing2": {
    "a": true,
    "b": true,
    "c": true,
    "d": true
  },
  "thing3": {
    "a": true,
    "b": false,
    "c": false,
    "d": false
  }
}

我想保留包含"true"值的对象,并删除其值不是true的键。

我在JQ方面没有太多经验,也没有如何正确构造json数据。如果这意味着要重组主要的JSON数据,我也愿意这样做。

这是我想要达到的结果:

{
  "thing1": {
    "b": true
  },
  "thing2": {
    "a": true,
    "b": true,
    "c": true,
    "d": true
  },
  "thing3": {
    "a": true
  }
}

3 个答案:

答案 0 :(得分:1)

# First remove the subkeys that are not truthy:
map_values(with_entries(select(.value)))
# ... then remove the empty dictionaries:
| with_entries(select(.value|length > 0))

添加调味料。

答案 1 :(得分:0)

即使问题专门针对 jq ,所讨论的JSON操作类型也很典型,并且可以使用基于walk-path的unix来实现或者实用程序 jtc

有多种方法可以做到:

1。删除(-p)所有不需要的(此处为false值):

jtc -w'<false>j:' -p input.json

2。删除所有JSON值,但需要的(-pp),这里是true值:

jtc -w'<true>j:' -pp input.json
  • 使用相同的方法可以删除任何JSON值(以及使用各自的搜索语言类型删除任何类型的JSON值)

PS>披露:我是jtc-用于JSON操作的shell cli工具的创建者

答案 2 :(得分:0)

另一个jq脚本:

<file jq 'del(..|select(. == false))'

此操作将递归转到所有节点(运算符..),并删除所有值为false的元素。

如果需要,您可以用select以外的其他名称(例如false来更改"Failure"中的条件。