linux下使用jq来处理json数据

当我们在LInux下需要处理json数据时,第一反应是用脚本编写一个工具,这样即耗时又不通用. 本文将介绍专门的命令行json处理工具jq

我们先安装jq,再来看看如何使用这个工具

yum install jq -y

一般我都选择yum安装,当然也可以使用源码来安装,源码可以在github上下载,地址是:https://github.com/stedolan/jq或者https://pkgs.org/download/jq这个地方下载对应类型的安装包

接下来我们讲讲如何使用jq,首先我们先构建一个json来方便我们下一步的操作讲解,文件名命名为test.json

{
    "name": "中国",
    "province": [{
        "name": "黑龙江",
        "cities": {
            "city": ["哈尔滨", "大庆"]
        }
    }, {
        "name": "广东",
        "cities": {
            "city": ["广州", "深圳", "珠海"]
        }
    }, {
        "name": "台湾",
        "cities": {
            "city": ["台北", "高雄"]
        }
    }, {
        "name": "新疆",
        "cities": {
            "city": ["乌鲁木齐"]
        }
    }]
}

解析json对象,我们这样操作

cat test.json | jq '.name'
"中国"

cat test.json | jq '.province[0].name' #取数组的第一个对象名字
"黑龙江"

cat test.json | jq '.province[].name' #不定义索引数组的下标,那么将会遍历输出所有对应对象的名称
"黑龙江"
"广东"
"台湾"
"新疆"

提取节点字段,我们这样操作

cat test.json | jq '.province[0]' #这样我们将得到一个json对象节点
{
  "cities": {
    "city": [
      "哈尔滨",
      "大庆"
    ]
  },
  "name": "黑龙江"
}

$ cat test.json | jq '.province[]' 
{
  "cities": {
    "city": [
      "哈尔滨",
      "大庆"
    ]
  },
  "name": "黑龙江"
}
{
  "cities": {
    "city": [
      "广州",
      "深圳",
      "珠海"
    ]
  },
  "name": "广东"
}
{
  "cities": {
    "city": [
      "台北",
      "高雄"
    ]
  },
  "name": "台湾"
}
{
  "cities": {
    "city": [
      "乌鲁木齐"
    ]
  },
  "name": "新疆"
}

$ cat test.json | jq '.province[0] | {name ,cities}'
{
  "cities": {
    "city": [
      "哈尔滨",
      "大庆"
    ]
  },
  "name": "黑龙江"
}

$ cat test.json | jq '.province[0] | {name}'
{
  "name": "黑龙江"
}

内建函数

keys用来提取json中的key元素

$ cat test.json | jq 'keys'
[
  "name",
  "province"
]

$ cat test.json | jq '.|keys'
[
  "name",
  "province"
]

$ cat test.json | jq '.province[0]|keys'
[
  "cities",
  "name"
]

$ cat test.json | jq '.province[]|keys'
[
  "cities",
  "name"
]
[
  "cities",
  "name"
]
[
  "cities",
  "name"
]
[
  "cities",
  "name"
]

has用来判断是否存在某个key

$ cat test.json | jq 'has("name")'
true
$ cat test.json | jq '.province[0] | has("name")'
true
$ cat test.json | jq 'has("noname")'
false

jq 带上-r 选项可以去掉双引号

#不带-r选项
echo '{"a":"foo","b":"bar"}  | jq .a 
"foo"
#带-r选项
echo '{"a":"foo","b":"bar"}  | jq -r .a
foo

验证json,若json串格式错误的话,可以直接使用jq运行,会报出具体错误.


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/526.html