美文网首页寒哥管理的技术专题我用 Linux程序员
Linux中在命令行中使用JQ来解析修改JSON字符串

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

作者: 橘汁绊饭 | 来源:发表于2017-10-26 03:43 被阅读818次

    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字符串

        本文链接:https://www.haomeiwen.com/subject/aykhpxtx.html