shell解析json字符串(代码片段)

ihoudf ihoudf     2022-10-23     204

关键词:

在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>中查找所需的值。它没有外部依赖或其它的设置,对于小项目很方便。当您的项目变大时,手动编写序列化... 查看详情