V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
ryncsn
V2EX  ›  分享创造

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

  •  1
     
  •   ryncsn ·
    ryncsn · 2021-10-31 03:51:38 +08:00 · 3218 次点击
    这是一个创建于 1120 天前的主题,其中的信息可能已经有所发展或是发生改变。
    起因是希望在路由器上去用脚本调用一些 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 什么语法,应该有不少可以改进的地方,自己初步试了一下感觉还可以,欢迎尝试...
    14 条回复    2022-04-16 13:59:05 +08:00
    ch2
        1
    ch2  
       2021-10-31 11:11:11 +08:00   ❤️ 1
    一般我是用 python 的
    version=$(python3 -c "import json; print(json.load(open('package.json'))['version'],end='')")
    iamzuoxinyu
        2
    iamzuoxinyu  
       2021-10-31 11:36:23 +08:00   ❤️ 1
    jq 它不香么。
    Nasei
        3
    Nasei  
       2021-10-31 11:37:36 +08:00   ❤️ 1
    可以把 shell 换成 powershell (逃
    ryncsn
        4
    ryncsn  
    OP
       2021-10-31 12:26:33 +08:00 via Android
    @ch2
    @iamzuoxinyu
    主要是是在一些特殊环境里,除了 shell 几乎啥都没有,这个工具可能有些用途。
    deplivesb
        5
    deplivesb  
       2021-10-31 12:49:18 +08:00
    有 jq 不香么
    neilp
        6
    neilp  
       2021-10-31 12:51:00 +08:00   ❤️ 1
    这个要赞.
    ryncsn
        7
    ryncsn  
    OP
       2021-10-31 12:58:26 +08:00 via Android
    @neilp 哇,大佬,一直在用你的 acme.sh 。👍
    Aumujun
        8
    Aumujun  
       2021-10-31 13:35:32 +08:00   ❤️ 1
    可以 确实有很大的用途,我这里很多机器都是不通外网 没有源库
    garywill
        9
    garywill  
       2021-10-31 17:44:36 +08:00   ❤️ 1
    60 行以下就搞定了的确不错。jq 在电脑上看了下,带上依赖可能要 700k 空间
    Senorsen
        10
    Senorsen  
       2021-10-31 20:24:11 +08:00   ❤️ 1
    强啊,感觉在一些资源紧张的地方会比较有用。

    顺便,建议用这个测试集做单元测试覆盖: https://github.com/nst/JSONTestSuite
    ryncsn
        11
    ryncsn  
    OP
       2021-10-31 21:38:56 +08:00
    @Senorsen 非常感谢,正想找有没有什么比较好的 JSON 测试集,帮了大忙了。
    ryncsn
        12
    ryncsn  
    OP
       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
        13
    hljjhb  
       2021-11-01 11:14:30 +08:00
    赞,的确会有这个需求
    quericy
        14
    quericy  
       2022-04-16 13:59:05 +08:00   ❤️ 1
    棒,刚好有这样的需求
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1180 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 23:56 · PVG 07:56 · LAX 15:56 · JFK 18:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.