关键词:
在shell脚本中有时候需要解析json字段信息,但是一般简单的sed&awk都存在问题,比如多层json结构解析失败。本文介绍两种比较优秀的方法,各有优缺点
使用awk解析
方法简要说明:
-
是先查找一个字符串:带双引号的key。如果没找到,则直接返回defaultValue。
-
查找最近的冒号,找到后认为值的部分开始了,直到在层数上等于0时找到这3个字符:,]。
-
如果有多个同名key,则依次全部打印(不论层级,只按出现顺序)
-
getJsonValuesByAwk方法
### 方法简要说明:
### 1. 是先查找一个字符串:带双引号的key。如果没找到,则直接返回defaultValue。
### 2. 查找最近的冒号,找到后认为值的部分开始了,直到在层数上等于0时找到这3个字符:,]。
### 3. 如果有多个同名key,则依次全部打印(不论层级,只按出现顺序)
### @author lux feary
###
### 3 params: json, key, defaultValue
function getJsonValuesByAwk()
awk -v json="$1" -v key="$2" -v defaultValue="$3" 'BEGIN
foundKeyCount = 0
while (length(json) > 0)
# pos = index(json, "\\""key"\\""); ## 这行更快一些,但是如果有value是字符串,且刚好与要查找的key相同,会被误认为是key而导致值获取错误
pos = match(json, "\\""key"\\"[ \\\\t]*?:[ \\\\t]*");
if (pos == 0) if (foundKeyCount == 0) print defaultValue; exit 0;
++foundKeyCount;
start = 0; stop = 0; layer = 0;
for (i = pos + length(key) + 1; i <= length(json); ++i)
lastChar = substr(json, i - 1, 1)
currChar = substr(json, i, 1)
if (start <= 0)
if (lastChar == ":")
start = currChar == " " ? i + 1: i;
if (currChar == "" || currChar == "[")
layer = 1;
else
if (currChar == "" || currChar == "[")
++layer;
if (currChar == "" || currChar == "]")
--layer;
if ((currChar == "," || currChar == "" || currChar == "]") && layer <= 0)
stop = currChar == "," ? i : i + 1 + layer;
break;
if (start <= 0 || stop <= 0 || start > length(json) || stop > length(json) || start >= stop)
if (foundKeyCount == 0) print defaultValue; exit 0;
else
print substr(json, start, stop - start);
json = substr(json, stop + 1, length(json) - stop)
'
- 测试脚本
json='"code":200,"msg":"success","data":"orderNo":"test_order_no"'
getJsonValuesByAwk "$json" "code" "defaultValue"
getJsonValuesByAwk "$json" "data" "defaultValue"
getJsonValuesByAwk "$json" "orderNo" "defaultValue"
- 结果反馈
200
"orderNo":"test_order_no"
"test_order_no"
使用专门的Json解析库: jq - Command-line JSON processor
- 安装
# 安装
yum install jq
- 格式化展示
echo '"name":"tenmao","age":10,"hobbies":["bar","foo"],"address":"province":"gd","city":"sz"' | jq
JSON格式化
- 提取特定的值:
use_jq.sh
raw='"name":"tenmao","age":10,"hobbies":["bar","foo"],"address":"province":"gd","city":"sz"'
echo $raw | jq -r '.name'
echo $raw | jq -r '.hobbies'
echo $raw | jq -r '.hobbies[0]'
echo $raw | jq -r '.address.city'
[root@VM_77_51_centos ~]# bash use_jq.sh
tenmao
[
"bar",
"foo"
]
bar
sz
参考
作者:十毛tenmao
链接:https://www.jianshu.com/p/333367027eaa
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
shell处理json字符串(代码片段)
对于shell一般字符串的解析可以使用grep/sed/cut/awk等命令,对于json字符串的解析一般使用jq命令,但是有时需要在shell中构建json字符串,对于这种情况下使用python处理非常方便,下面便在shell中调用python构建json字符... 查看详情
shell解析json字符串(代码片段)
...;各有优缺点使用awk解析方法简要说明:是先查找一个字符串:带双引号的key。如果没找到,则直接返回defaultValue。查找最近的冒号,找到后认为值的部分开始了,直到在层数上等于0时找到这3个字符:,]。... 查看详情
shell解析json字符串(代码片段)
...;各有优缺点使用awk解析方法简要说明:是先查找一个字符串:带双引号的key。如果没找到,则直接返回defaultValue。查找最近的冒号,找到后认为值的部分开始了,直到在层数上等于0时找到这3个字符:,]。... 查看详情
shell处理json字符串(代码片段)
对于shell一般字符串的解析可以使用grep/sed/cut/awk等命令,对于json字符串的解析一般使用jq命令,但是有时需要在shell中构建json字符串,对于这种情况下使用python处理非常方便,下面便在shell中调用python构建json字符... 查看详情
解析json字符串(代码片段)
webservice返回json字符串后需要解析,举例如下:packagecom.glaway.offline.test.main;importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;publicclassJsonTestpublicstaticvoidmain(String[]args)test 查看详情
shell全解析:shell脚本(代码片段)
...Shell脚本中常见命令4.1Shellecho命令4.1.1echo中直接输出普通字符串4.1.2echo中显示转义字符4.1.3echo中读取输入4.1.4echo换行操作4.1.4.1默认每一个echo占一行的4.1.4.2输出中增加一个换行 查看详情
gson解析json字符串(代码片段)
Gson怎样使用gson把一个json字符串解析成一个jsonObject对象因此我要把上面的fastjson转换成是gson,如下图:JsonObjectobject=newJsonParser().parse(result).getAsJsonObject();怎样从gson中取出键的值使用gson把json字符串转换成一个list集合Lis... 查看详情
gson解析json字符串(代码片段)
Gson怎样使用gson把一个json字符串解析成一个jsonObject对象因此我要把上面的fastjson转换成是gson,如下图:JsonObjectobject=newJsonParser().parse(result).getAsJsonObject();怎样从gson中取出键的值使用gson把json字符串转换成一个list集合Lis... 查看详情
shell全解析:字符串变量和数组变量(代码片段)
文章目录一、前言二、Shell字符串变量2.1单引号、双引号和反引号2.2字符串三种形式2.3字符串变量赋值与读取2.4字符串拼接2.5获取字符串长度2.6提取子字符串三、shell数组3.1数组定义3.2数组赋值3.3数组读取3.4获取数组长度四、shell... 查看详情
关于json解析的问题(代码片段)
...数据显示到页面上。在接受服务器端数据数据时,一般是字符串。这时,就需要用到JSON里面的API来进行转换了; JSON.parse() parse()方法用于从一个字符串中解析出JSON对象例:varstr=‘"name":"xianyu","age":"21" 查看详情
转java解析多层json(代码片段)
java分别解析下面两个json字符串packagejansonDemo;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;publicclassTestJSON/***JSON实际上也是键值对("key":"value")*key必 查看详情
java字符串用json来解析(代码片段)
JAVA字符串用解析json来解析一背景介绍在开发过程中,经常会遇到参数解析的情况。特别是对字符串进行解析,笔者在开发过程中也遇到过这种情况。特别是在查询后端数据对返回对象中。返回内容比较复杂。往往是数组... 查看详情
java字符串用json来解析(代码片段)
JAVA字符串用解析json来解析一背景介绍在开发过程中,经常会遇到参数解析的情况。特别是对字符串进行解析,笔者在开发过程中也遇到过这种情况。特别是在查询后端数据对返回对象中。返回内容比较复杂。往往是数组... 查看详情
浅谈android项目----json解析(4种解析技术详解)(代码片段)
...级的数据交换格式。2.特点:1.本质就是具有特定格式的字符串2.json完全独立于编程语言3.json比xml数据传输的有效性要高出很多Android系统也原生的提供了JSON解析的API,但是它的速度很慢,而且没有提供简介方便的接口来提高开发... 查看详情
fastjson(代码片段)
...astjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。fastjson的API十分简洁。Stringtext=JSON.toJSONString(obj);//序列化VOvo=JSON.pa 查看详情
qt平台下使用qjson解析和构建json字符串(代码片段)
本文转载自:Qt平台下使用QJson解析和构建JSON字符串-知乎原作者总结的很好,受益很大,学习到了开发平台基于Qt5.8Windows。示例的JSON字符串和上一篇使用的是一样的。JSON解析示例包括:和风天气实时数据心知天... 查看详情
当json遇到map(代码片段)
...由下游定义相应的解析模型。比如像下面这个简单的Json字符串。 查看详情
flutter--------解析json数据(代码片段)
...化是指使使用dart:convert中内置的JSON解码器。它将原始JSON字符串传递给JSON.decode()方法,然后在返回的Map<String,dynamic>中查找所需的值。它没有外部依赖或其它的设置,对于小项目很方便。当您的项目变大时,手动编写序列化... 查看详情