Linux中在命令行中使用JQ来解析修改JSON字符串
在现实开发场景中, 经常需要在命令行中做一些解析json数据的工作,在linux中并没有提供太多有用了工具来帮你完成这样的工作,在经过寻找以后发现一个叫做jq的工具,可以帮你在命令行中做相关的解析工作。
要使用请先安装
sudo apt-get install jq -y
- 查找所需要的属性(查询)
通过命令行,我们首先使用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的数据只要按照这个写法就好了
- 修改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"
}
]
这样的话,上面的命令是不是更加好理解了。