如何使用 stedolan/jq 摆脱 JSON 中的空值



真正的问题有点复杂,但我对以下json格式有问题。

命令:
echo '[{"user":"a","title":"aaa"},{"user":"b","title":null}]' | jq '.[]'

外:

{
  "user": "a",
  "title": "aaa"
}
{
  "user": "b",
  "title": null
}

我想:

{
  "user": "a",
  "title": "aaa"
}
{
  "user": "b"
}

所以我这样做:
echo '[{"user":"a","title":"aaa"},{"user":"b","title":null}]' | jq '.[]|{user:.user, title:(.title//empty)}'

结果:

{
  "user": "a",
  "title": "aaa"
}

可悲的是,整个后一个对象被删除了。 如果你知道一些好的解决方案?

最直接的方法就是简单地删除出现不需要的密钥,例如:

map( if .title == null then del(.title) else . end)

使用walk/1

如果要全局执行此操作(即,无论 .title 为空的任何地方,无论对象出现在何处(:

walk(if type == "object" and .title == null then del(.title) else . end)

这可以使用通用函数进行一些整理,when/2

 def when(p;q): if p? // false then q else . end;

现在我们可以简单地写:

 walk( when(.title == null; del(.title)) )

应有尽有

def when(p;q): if p? // false then q else . end; 
walk( when(type=="object"; with_entries( select(.value != null ))))

或者,使用基于Unix步行路径的Unix实用程序可以实现相同的要求jtc

bash $ JSN='[{"user":"a","title":"aaa"},{"user":"b","title":null}]'
bash $ <<<$JSN jtc -w'[title]:<>n:' -p
[
   {
      "title": "aaa",
      "user": "a"
   },
   {
      "user": "b"
   }
]
bash $ 

这将删除所有(如果有多个(记录"title":null如果需要删除所有null值(不仅按title限定范围(,则-w'<>n:'要使用的步行路径

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

相关内容

  • 没有找到相关文章

最新更新