如何使用Linux命令行工具解析和打印JSON

  • 如何使用Linux命令行工具解析和打印JSON已关闭评论
  • 241 views
  • A+
所属分类:linux

如何使用Linux命令行工具解析和打印JSONJSON is a lightweight and language independent data storage format, easy to integrate with most programming languages and also easy to understand by humans, of course when properly formatted. The word JSON stands for JavaScript Object Notation, though it starts with JavaScript, and primarily used to exchange data between server and browser, but now being used in many fields including embedded systems. Here we’re going to parse and pretty print JSON with command line tools on Linux. It’s extremely useful for handling large JSON data in a shell scripts, or manipulating JSON data in a shell script.

JSON是一种轻量级且与语言无关的数据存储格式,易于与大多数编程语言集成,也易于人类理解,主要用于服务器和浏览器之间交换数据,但现在在很多领域,包括嵌入式系统中使用。在这里,我们将使用Linux上的命令行工具解析并打印JSON。它对于在shell脚本中处理大型JSON数据或在shell脚本中处理JSON数据非常有用。

怎样直观的打印json

JSON数据的结构更具人性化。但是在大多数情况下,即使没有行结束字符,JSON数据也会存储在一行中。

显然,手动阅读和编辑不太方便。

那时漂亮的印刷很有用。该名称非常自我解释,重新格式化JSON文本,使人们更清晰。这被称为JSON漂亮的打印

使用Linux命令行工具解析和打印JSON

可以使用命令行文本处理器(如awksedgerp)解析JSON数据。实际上JSON.awk是一个awk脚本来做到这一点。但是,有一些专用工具可用于同一目的。

  1. jqjshon,shell的JSON解析器,它们都非常有用。

  2. Shell脚本(如JSON.shjsonv.sh)用于解析bash,zsh或dash shell中的JSON。

  3. JSON.awk,JSON解析器awk脚本。

  4. json.tool这样的Python模块。

  5. underscore-cli,Node.js和基于javascript的。

在本教程中,我只关注jq,它是具有高级过滤和脚本功能的shell的非常强大的JSON解析器。

JSON漂亮印刷

JSON数据可能在一个人身上并且几乎难以辨认,因此为了使其具有一定的可读性,JSON漂亮的打印就在这里。

示例:来自jsonip.com的数据,以获取JSON格式的外部IP地址,使用如下所示的curlwget工具。

$ wget -cq http://jsonip.com/ -O -

实际数据如下所示:

{"ip":"111.222.333.444","about":"/about","Pro!":"http://getjsonip.com"}

现在用jq打印它:

$ wget -cq http://jsonip.com/ -O - | jq '.'

在使用jq过滤结果后,这应该如下所示。

{

   "ip": "111.222.333.444",

   "about": "/about",

   "Pro!": "http://getjsonip.com"

}

使用python json.tool模块可以完成同样的事情。这是一个例子:

$ cat anything.json | python -m json.tool

这种基于Python的解决方案对于大多数用户来说应该没问题,但是如果没有预安装或无法安装Python,就像在嵌入式系统上一样。

然而,json.tool python模块具有明显的优势,它是跨平台的。因此,您可以在Windows,Linux或Mac OS上无缝使用它。

如何用jq解析JSON

首先,您需要安装jq,它已被大多数GNU / Linux发行版选中,并使用各自的软件包安装程序命令进行安装。

在Arch Linux上:

$ sudo pacman -S jq

在Debian,Ubuntu,Linux Mint:

$ sudo apt-get install jq

在 Fedora:

$ sudo dnf install jq

在 openSUSE:

$ sudo zypper install jq

或者编译安装

git clone https://github.com/stedolan/jq.git
cd jq
autoreconf -i
./configure --disable-maintainer-mode
make
sudo make install

jq的基本过滤器和标识符

jq可以从stdin文件中读取JSON数据。你必须根据情况使用两者。

单一的象征是最基本的过滤器。这些过滤器也称为对象标识符索引。使用单一随着jq基本上漂亮打印输入JSON文件。

单引号 - 您不必始终使用单引号。但是如果你在一行中组合几个过滤器,那么你必须使用它们。

双引号 - 你必须在两个双引号中包含任何特殊字符,如@$,例如jq .foo。“@ bar”

原始数据打印 - 出于任何原因,如果您只需要最终解析数据(不包含在双引号内),请将-r标志与jq命令一起使用,如下所示。- jq -r .foo.bar

解析特定数据

要过滤掉JSON的特定部分,您需要查看漂亮打印的JSON文件的数据层次结构。

来自维基百科(Wikipedia)的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],对于下一个项目,它应该每步增加一个。

$ jq .phoneNumber[0] sample.json

脚本示例

假设我只想要home的数字,而不是整个JSON数组数据。这是jq命令中的脚本编写方便的时候。

$ cat sample.json | jq -r '.phoneNumber[] | select(.type == "home") | .number'

首先,我将一个文件管理器的结果传递给另一个,然后使用select属性选择特定类型的数据,再次将结果传递给另一个过滤器。

解释每种类型的jq过滤器和脚本超出了本教程的范围和目的。强烈建议您阅读JQ手册,以便更好地理解下面的内容。

  • 安卓客户端下载
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin
avatar