小作品:写了一个完全用 POSIX Shell 实现的迷你 JSON 解析器

2021-10-31 03:51:38 +08:00
 ryncsn
起因是希望在路由器上去用脚本调用一些 REST 服务,但是 shell 中没有解析 JSON 的好方法,又不想再安装额外的 binary 了,现有的纯 Shell 的 JSON 解析器都非常长,于是写了个很短的 POSIX Shell 的 JSON 解析器。

特点是:
- 很短,可以直接粘贴在脚本里用(目标是 60 行以下)
- 兼容性强,只用了 POSIX 语法和 sed 。
- 提供基本的错误处理。

地址: https://github.com/ryncsn/poorjson.sh

使用方法就是:
# Just pipe JSON to it, and use parameters to query:
# (Note strings are quoted with "")
echo '{"key": ["ele1", "ele2", "ele3", "ele4"]}' | ./poorjson.sh '"key"' 2
# Prints:
# "ele3"

# If output is array or object, it's printed a token per line
echo '{"top-key": {"key1": [ "value1", "value2"], "key2": "value2"} }' | ./poorjson.sh '"top-key"' '"key1"'
# Prints:
# [
# "value1"
# ,
# "value2"
# ]

刚刚出炉,用于在 shell 脚本里提取 JSON 中的一些值非常方便。
不确定有没有什么问题,比如忘记 cover JSON 什么语法,应该有不少可以改进的地方,自己初步试了一下感觉还可以,欢迎尝试...
2980 次点击
所在节点    分享创造
14 条回复
ch2
2021-10-31 11:11:11 +08:00
一般我是用 python 的
version=$(python3 -c "import json; print(json.load(open('package.json'))['version'],end='')")
iamzuoxinyu
2021-10-31 11:36:23 +08:00
jq 它不香么。
Nasei
2021-10-31 11:37:36 +08:00
可以把 shell 换成 powershell (逃
ryncsn
2021-10-31 12:26:33 +08:00
@ch2
@iamzuoxinyu
主要是是在一些特殊环境里,除了 shell 几乎啥都没有,这个工具可能有些用途。
deplivesb
2021-10-31 12:49:18 +08:00
有 jq 不香么
neilp
2021-10-31 12:51:00 +08:00
这个要赞.
ryncsn
2021-10-31 12:58:26 +08:00
@neilp 哇,大佬,一直在用你的 acme.sh 。👍
Aumujun
2021-10-31 13:35:32 +08:00
可以 确实有很大的用途,我这里很多机器都是不通外网 没有源库
garywill
2021-10-31 17:44:36 +08:00
60 行以下就搞定了的确不错。jq 在电脑上看了下,带上依赖可能要 700k 空间
Senorsen
2021-10-31 20:24:11 +08:00
强啊,感觉在一些资源紧张的地方会比较有用。

顺便,建议用这个测试集做单元测试覆盖: https://github.com/nst/JSONTestSuite
ryncsn
2021-10-31 21:38:56 +08:00
@Senorsen 非常感谢,正想找有没有什么比较好的 JSON 测试集,帮了大忙了。
ryncsn
2021-10-31 23:52:26 +08:00
@Senorsen 简单修了一下,现在基本都能 cover 到了( •̀ ω •́ )y ,和 JSON.sh 和 Python 对比了一下,除了一些特殊字符问题应该都可以了。
![Screenshot.png]( https://i.loli.net/2021/10/31/svK4IiEa82CwB6b.png)
hljjhb
2021-11-01 11:14:30 +08:00
赞,的确会有这个需求
quericy
2022-04-16 13:59:05 +08:00
棒,刚好有这样的需求

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/811831

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX