前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用jq处理JSON数据(一)

使用jq处理JSON数据(一)

作者头像
FunTester
发布2021-03-30 11:44:28
2.6K0
发布2021-03-30 11:44:28
举报
文章被收录于专栏:FunTesterFunTester

在平常的工作中,遇到的接口响应格式绝大多数都是JSON格式,对于这种格式的数据有时候又爱又恨。很多时候要看懂层级,很多人会使用一些格式化工具(包括在线工具)。我自己写了一个方法来处理JSON格式的数据,之前写过文章:将json数据格式化输出到控制台,后来又更新了一些其他功能,修复了一些BUG,展示格式如下:

代码语言:javascript
复制
INFO-> 当前用户:fv,IP:192.168.0.102,工作目录:/Users/fv/Documents/workspace/funtester/,系统编码格式:UTF-8,系统Mac OS X版本:10.16
INFO-> 
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~
>  {
>  ① . "msg":"FunTester",
>  ① . "new":{
>  ② . . . "36safs3":324,
>  ② . . . "36s234s3":324,
>  ② . . . "32432":4324,
>  ② . . . "data":{
>  ③ . . . . . "32":411324
>  ② . . . }
>  ① . },
>  ① . "new21":322
>  }
~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~ JSON ~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~~☢~

Process finished with exit code 0

源码大家可以点击阅读原文找到GitHubGitee的地址。

在本文中,我们将学习如何使用jq命令行优雅地处理JSON格式数据。

jq可在各种平台上运行,可用于LinuxWindowsMac OS

对于以下许多示例,我们将使用一个名为FunTester.json的文件,其中包含以下JSON内容:

代码语言:javascript
复制
{
    "name": "FunTester",
    "article": [{
            "author": "tester1",
            "title": "ApiTest"
        }, {
            "author": "tester2",
            "title": "performanceTest"
        }
    ]
}

jq基本语法

通常,通过将JSON管道输送到其标准输入来调用jq。如下:

代码语言:javascript
复制
FunTester:~ fv$ echo '{"name":"FunTester"}' | jq
{
  "name": "FunTester"
}

没有任何参数,jq只是输出JSON输入数据,这里输出数据已重新格式化。jq默认情况下输出格式的JSON。我们可以将少量的JSON数据通过管道传递给jq并获得格式正确的输出。

jq可以使用一个或多个过滤器作为参数。最简单的过滤器是.。返回整个JSON数据的内容,这一点跟JsonPath类似,有兴趣的同学可以翻一翻我写过的JsonPath的文章。

下面的shell跟上面的命令行结果是一致的。

echo '{"name":"FunTester"}' | jq '.'

现在,我们可以向过滤器添加一个简单的对象标识符。为此,我们将使用前面提到的FunTester.json文件。通过.name获取名字的内容。

代码语言:javascript
复制
FunTester:Downloads fv$ cat FunTester.json | jq '.name'
"FunTester"

可以使用[]语法获取数组信息:

代码语言:javascript
复制
FunTester:Downloads fv$ cat FunTester.json | jq '.article[1]'
{
  "author": "tester2",
  "title": "performanceTest"
}

同理,我们可以将这两个语法组合起来:

代码语言:javascript
复制
FunTester:Downloads fv$ cat FunTester.json | jq '.article[1].title'
"performanceTest"

如何我们想提取数组对象中某一个keyvalue集合,可以这么写:

代码语言:javascript
复制
FunTester:Downloads fv$ cat FunTester.json | jq '.article[].title'
"ApiTest"
"performanceTest"

处理响应

当然,我们也可以用jq处理响应结果。这是一个jq常见用法,我用moco API封装框架,将上面的JSON数据当做一个接口的响应。

代码语言:javascript
复制
   此处省略代码500行
        server.get(urlOnly("/jq/test")).response(RWUtil.readTextByString("/Users/fv/Downloads/FunTester.json"))
   此处省略代码500行

我们首先验证接口正常,URLhttp://localhost:12345/jq/test,放到浏览器中能够看到FunTester.json文件的内容,为了不干扰各位阅读,这里就不重复放了。

下面我们用curl命令访问接口,并获取响应结果,然后使用jq命令获取一些值的集合。

代码语言:javascript
复制
FunTester:Downloads fv$ curl http://localhost:12345/jq/test | jq '.name,.article[1].author'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   223  100   223    0     0  13937      0 --:--:-- --:--:-- --:--:-- 13937
"FunTester"
"tester2"

这个地方,我在此处使用逗号分隔了两个不同的过滤器。

相比JsonPath工具,jq更像是命令行版本的JsonPath,而且输出格式方面非常不错的效果。接下来,我会继续探索jq工具的函数语法使用。


FunTester,腾讯云年度作者Boss直聘签约作者,GDevOps全球敏捷峰会官方合作媒体,非著名测试开发er。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • jq基本语法
  • 处理响应
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档