Intro
用 AWK
和 Shell
写了个简单的 JSON 解析器
,初衷是方便我在路由器上编写 Shell 脚本。总大小 8K
,POSIX 兼容
,几乎可以运行于所有 *nix
系统。但因为性能不高,也没有做严格测试,如果不是设备空间不足不要使用。
它的功能远没有知名项目 jq
强大,只能做字段提取,语法类似 JavaScript
访问对象属性。
$ DOH_API='https://dns.alidns.com/resolve?name=dns.google&type=AAAA'
$ JQ_URI='https://mirror.ghproxy.com/https://raw.githubusercontent.com/vch'\
'eckzen/posix-awk-shell-jq/main/jq.sh'
$ curl -s "$DOH_API" | sh -c "$(curl -sL "$JQ_URI")" @ - 'Answer[0].data'
"2001:4860:4860::8888"#
Details
以下是实现思路:首先通过下表规则确定值类型,k 为键名,
类型 | 区分 |
---|---|
null | k 后首个冒号后首个非空白字符是 n |
布尔 | k 后首个冒号后首个非空白字符是 t/f |
数字 | k 后首个冒号后首个非空白字符是 数字 |
字符串 | k 后首个冒号后首个非空白字符是 " |
对象 | k 后首个冒号后首个非空白字符是 { |
数组 | k 后首个冒号后首个非空白字符是 [ |
数组元素 | k 形如 [num] |
接着根据类型分别找到起始字符,null
和 布尔
已由上一步确定。
类型 | 开始 | 结束 | 备注 |
---|---|---|---|
数字 | k 后首个数字 | 下个非数字 | nullable |
字符串 | k 后首个 " | 下个非转义 " | nullable |
对象 | k 后首个 { | 下个非嵌套对象内且非转义 } | nullable,可跨行 |
数组 | k 后首个 [ | 下个非嵌套数组内且非转义 ] | nullable,可跨行 |
数组元素 | idx=0,[ 后;idx!=0,idx 个非嵌套对象内及非字符 , 后,首个非空白字符 | 下个非嵌套对象内及非转义 , 或 ] | nullable,可跨行 |
最后,如果这个项目对你有帮助,请到 Github 上为我点颗星。如果在使用过程中遇到问题,也欢迎在页面下方留言。
如有问题请在下方留言,文章转载请注明出处,详细交流请加下方群组!请大佬不要屏蔽文中广告,因为它将帮我分担服务器开支,如果能帮忙点击我将万分感谢。