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

使用jq处理JSON数据(二)

作者头像
FunTester
发布2021-04-20 15:41:22
3.4K0
发布2021-04-20 15:41:22
举报
文章被收录于专栏:FunTesterFunTester

之前的文章使用jq处理JSON数据(一)中,我分享了jq工具的基本用法。今天开始分享jq的高阶使用,包括管道符、函数以及格式转换。

管道符和函数

在这个章节中中,将分享jq更多过滤JSON数据的方法。

使用|运算符,我们可以结合两个过滤器。它的工作原理与Unix系统管道符类似。左边的过滤器的输出传递到右边的过滤器。

请注意:.name.first.name | .first使用结果是完全相同的,就将JSON数据中.name节点数据传递到第二个过滤器,然后选择.first

管道可以跟其他功能组合。例如,我们可以使用keys函数来获取JSON数据某个节点的键集合:

代码语言:javascript
复制
 ✘ fv@FunTester  ~/Downloads  cat FunTester.json  | jq '. | keys'
[
  "article",
  "name"
]
 fv@FunTester  ~/Downloads 

使用length函数,我们可以获得数组中元素的数量长度:

代码语言:javascript
复制
 fv@FunTester  ~/Downloads  cat FunTester.json  | jq '. | keys | length'
2

length函数的输出取决于输入元素:

  • 如果传递了字符串,则返回字符length
  • 对于数组,返回元素个数length或者size
  • 对于对象,返回键-值对的size

我们还可以将length函数跟运算符组合使用:

代码语言:javascript
复制
 fv@FunTester  ~/Downloads  cat FunTester.json  | jq '. | keys | length > 1'
true

还有一个更厉害的筛选函数select,有点MySQL数据库的意味。

代码语言:javascript
复制
 ✘ fv@FunTester  ~/Downloads  cat FunTester.json | jq '.article[] | select (.author == "tester2")'
{
  "author": "tester2",
  "title": "performanceTest"
}

select函数后面跟的boolean表达式还可以是其他很多种形式,这里不再意义演示。

转换格式

这个章节,我将分享一些使用jq将原来JSON数据组合转换其他格式的技巧。

先来拼接一个简单的JSON格式数据:

代码语言:javascript
复制
 fv@FunTester  ~/Downloads  cat FunTester.json | jq  '{(.article[0].title): "FunTester"}'
{
  "ApiTest": "FunTester"
}

这个例子中,首先我创建了一个只有一对键值对的JSON对象,其中key是从原来数据中取到的,表达式为(.article[0].title),这个在上一篇文章中已经讲过了,这里不多说。value我直接赋值为FunTester

请注意,jq表达式中,要想构建新的JSON格式数据,如果key为表达式时,需要用()括起来,但是value是表达式的时候就不用了,仅限于单表达式,下面会介绍一些复合表达式不适用。下面这个例子演示value的值是表达式的时候。

代码语言:javascript
复制
 fv@FunTester  ~/Downloads  cat FunTester.json | jq  '{(.article[0].title): .article}'
{
  "ApiTest": [
    {
      "author": "tester1",
      "title": "ApiTest"
    },
    {
      "author": "tester2",
      "title": "performanceTest"
    }
  ]
}

下面介绍一下map函数,map函数用于通过提取某个节点下的某个value值集合来组成新的数组。

代码语言:javascript
复制
 ✘ fv@FunTester  ~/Downloads  cat FunTester.json | jq  '{(.article[0].title): (.article | map(.title))}'
{
  "ApiTest": [
    "ApiTest",
    "performanceTest"
  ]
}

我们再通过一个实验来探索一下map函数的用法:

代码语言:javascript
复制
 fv@FunTester  ~/Downloads  cat FunTester.json | jq  '{(.article[0].title): (.article | map("FunTester1","FunTester2"))}'
{
  "ApiTest": [
    "FunTester1",
    "FunTester2",
    "FunTester1",
    "FunTester2"
  ]
}

这里我将map函数中的参数写成了两个常量,最终的输出结果是两遍的常量,所以map函数执行了两遍,是跟前面的数组的长度一致的,而且没有去重功能。

接下来分享另外一个函数join,这个跟Java中拼接字符串的StringUtils.join()非常相似。下面是Java用的使用Demo

代码语言:javascript
复制
    public static String join(String text, String separator) {
        return StringUtils.join(ArrayUtils.toObject(text.toCharArray()), separator);
    }

下面是jqjoin函数的使用:

代码语言:javascript
复制
 fv@FunTester  ~/Downloads  cat FunTester.json | jq  '{(.article[0].title): (.article | map("FunTester1","FunTester2") | join("-"))}'
{
  "ApiTest": "FunTester1-FunTester2-FunTester1-FunTester2"
}

我用连接符,将刚才使用map函数构建的数组连接起来。


FunTester,腾讯云年度作者Boss直聘签约作者GDevOps官方合作媒体
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 管道符和函数
  • 转换格式
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档