如何用 Linux 命令行工具解析和格式化输出 JSON( 二 )

解析特定数据要过滤出 JSON 的特定部分 , 你需要了解格式化输出的 JSON 文件的数据层次结构 。
【如何用 Linux 命令行工具解析和格式化输出 JSON】来自维基百科的 JSON 数据示例:
{ "firstName": "John", "lastName": "Smith", "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021"}, "phoneNumber": [{ "type": "home", "number": "212 555-1234"},{ "type": "fax", "number": "646 555-4567"}], "gender": { "type": "male" }}我将在本教程中将此 JSON 数据用作示例 , 将其保存为 sample.json 。
假设我想从 sample.json 文件中过滤出地址 。所以命令应该是这样的:
$ jq .address sample.json示例输出:
{ "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021"}再次 , 我想要邮政编码 , 然后我要添加另一个对象标识符-索引 , 即另一个过滤器 。
$ cat sample.json | jq .address.postalCode另请注意 , 过滤器区分大小写 , 并且你必须使用完全相同的字符串来获取有意义的输出 , 否则就是 null 。
从 JSON 数组中解析元素JSON 数组的元素包含在方括号内 , 这无疑是非常通用的 。
要解析数组中的元素 , 你必须使用 [] 标识符以及其他对象标识符索引 。
在此示例 JSON 数据中 , 电话号码存储在数组中 , 要从此数组中获取所有内容 , 你只需使用括号 , 像这个示例:
$ jq .phoneNumber[] sample.json假设你只想要数组的第一个元素 , 然后使用从 0 开始的数组对象编号 , 对于第一个项目 , 使用 [0] , 对于下一个项目 , 它应该每步增加 1 。
$ jq .phoneNumber[0] sample.json脚本编程示例假设我只想要家庭电话 , 而不是整个 JSON 数组数据 。这就是用 jq 命令脚本编写的方便之处 。
$ cat sample.json | jq -r '.phoneNumber[] | select(.type == "home") | .number'首先 , 我将一个过滤器的结果传递给另一个 , 然后使用 select 属性选择特定类型的数据 , 再次将结果传递给另一个过滤器 。
解释每种类型的 jq 过滤器和脚本编程超出了本教程的范围和目的 。强烈建议你阅读 jq 手册 , 以便更好地理解下面的内容 。
资源:

  • https://stedolan.github.io/jq/manual/
  • http://www.compciv.org/recipes/cli/jq-for-parsing-json/
  • https://lzone.de/cheat-sheet/jq


推荐阅读