Linux中在命令行中使用JQ来解析修改JSON字符串

Linux中在命令行中使用JQ来解析修改JSON字符串

在现实开发场景中, 经常需要在命令行中做一些解析json数据的工作,在linux中并没有提供太多有用了工具来帮你完成这样的工作,在经过寻找以后发现一个叫做jq的工具,可以帮你在命令行中做相关的解析工作。

要使用请先安装

sudo apt-get install jq -y

  1. 查找所需要的属性(查询)

通过命令行,我们首先使用jd来从json字符串中解析我们所需要的属性。

首先我们先新建一个json文件,打开命令行输入:

gedit info.json

这个命令会新建一个info.json的文件,并通过Ubuntu自带的编辑器打开,

复制下面的json到文件中,保存

{
        "name": "Orange",
        "location":
                {
                        "city": "China"
                },
        "Company":
                 {
                         "name": "Siemens",
                          "division": "Developer"
                  }
}

然后在命令行中输入下面命令:

  • cat cat test.json | jq '.name' | jq '.name'
    "Orange"

  • cat info.json | jq '.location.city'
    "China"
    如果有多个属性需要查询,例如Company下面有name以及division属性,我们可以用一下命令

  • cat info.json |jq '.Company|{name,division}'
    { "name": "Siemens", "division": "Developer" }

是不是很简单,这样你想要查询任何一个json的数据只要按照这个写法就好了

  1. 修改json字符串的值(修改)

楼主现在公司做AWS CloudFormation有关的东西,AWS CloudFormation的配置是需要读取各种Json的配置文件的,通过是讲Json堆栈的配置文件转换成为一整套的AWS资源。所以我经常需要更新我的Json配置。但是AWS基本都是在linux上远程操作,然后通过脚本来进行自动测试,所以修改Json的配置文件是不可缺少的一项技能。

本文借此在这里来谈谈如何使用jq来修改Json文件

修改object类型的json

{
  "honesty": "Apple Jack",
  "laughter": "Pinkie Pie",
  "loyalty": "Rainbow Dash"
}

把之前的info.json文件打开,删掉原来的内容,讲上面的json复制进去,

我们可以看到,honesty的值当前为“Apple Jack”,现在如果我想讲“Apple Jack”更改为其他的值Orange:

cat info.json | 
  jq 'to_entries | 
       map(if .key == "honesty" 
          then . + {"value":"Orange"} 
          else . 
          end
         ) | 
      from_entries'

输出:

{
  "honesty": "Orange",
  "laughter": "Pinkie Pie",
  "loyalty": "Rainbow Dash"
}

通常情况下,我们只需要更改键的值就可以了。但是有的时候我需要连键一起更改的话,我们需要这么做:

cat info.json | 
  jq 'to_entries | 
       map(if .key == "honesty" 
          then . + {"key":"Orange"} 
          else . 
          end
         ) | 
      from_entries'

输出

{
  "Orange": "Apple Jack",
  "laughter": "Pinkie Pie",
  "loyalty": "Rainbow Dash"
}

如果想将修改后的字符串输入到文件中,只需要在命令后面追加
> new.json

覆盖掉原来的文件的内容,如果存在的话

>> new.json

在原来文件的后面追加新的内容,不会覆盖原来文件的内容

  • 我们知道在上述命令中使用了cat info.json | jq to_entries,通过这个命令,我们就能查看json的具体结构,map函数也是根据这个json的结构帮我们做了遍历操作
    [
      {
        "key": "honesty",
        "value": "Apple Jack"
      },
      {
        "key": "laughter",
        "value": "Pinkie Pie"
      },
      {
        "key": "loyalty",
        "value": "Rainbow Dash"
      }
    ]

这样的话,上面的命令是不是更加好理解了。

你可能感兴趣的:(Linux中在命令行中使用JQ来解析修改JSON字符串)