V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
holmes1412
V2EX  ›  C

分享一个小而美的 json-parser

  •  3
     
  •   holmes1412 · 2023-06-22 23:18:53 +08:00 · 1678 次点击
    这是一个创建于 525 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前阵子 Workflow 的作者为项目写了个 1000 行代码量级的json-parser,比较典雅精致。

    其中可以学习到 C 语言中经典的编码风格、递归解析的架构、简洁的接口设计,并且也非常方便引入项目中作为轻量级的 json 解析器。

    由于已经在 Workflow 项目中使用,所以代码质量和开源项目的长期投入都有保证~~~

    因此也来和小伙伴分享一下>w<

    👉 https://github.com/Barenboim/json-parser

    1 、 基于ANSI-C,完整支持 ECMA-404 json 标准;
    2 、 轻量级:只有json_parser.hjson_parser.c,依赖只有 linux 内核中的两个经典数据结构 rbtree.h 和 list.h ;
    3 、 高性能:虽然不是最快的,但实测性能大概是cJSON1.5 倍jsoncpp10 倍左右;
    4 、 简洁的接口,可以直接执行 make 命令把 test.c 编译出来感受一下:

    int main ()
    {
        ...
        json_value_t *val = json_value_parse(buf); // 解析 json 文档产生 json value
        if (val)
        { 
            print_json_value(val, 0);  
            json_value_destroy(val); // 销毁 json value
        }
        ...
    }
    

    5 、C 中常用的操作对象的接口写法,经典的编码风格,比较赏心悦目:

    /* 从 json value 中获得 string */
    const char *json_value_string(const json_value_t *val);
    
    /* 从 json value 中获得 num */
    double json_value_number(const json_value_t *val);
    
    /* 从 json value 中获得 json object */
    json_object_t *json_value_object(const json_value_t *val);
    
    /* 返回 object 大小 */
    int json_object_size(const json_object_t *obj); 
    
    /* 查找 name 下的 value 。返回 json value 对象 */
    const json_value_t *json_object_find(const char *name, const json_object_t *obj); 
    
    /* 遍历 json object 。这不是一个函数,是一个展开成一个 for 循环的宏 */
    json_object_for_each(name, val, obj)
    

    6 、 内部典雅的递归解析架构
    用户入口 json_value_t *json_value_create(const char *doc)
    会进入到递归入口 __parse_json_value( doc, &doc, 0, val );
    然后递归地将 json 中嵌套的数组对象的关系装到list/rbtree中。

    另外,Workflow 项目的 kernel 目录下基本都是 C 的实现,不仅有基本的 IO 多路复用、线程池、消息队列实现,还有与 event loop 不一样的 epoll/kqueue 新玩法:

    👉 https://github.com/sogou/workflow

    每一个模块单独拎出来都很好玩,感兴趣的话也可以围观~~~

    monkeyNik
        1
    monkeyNik  
       2023-09-14 13:40:27 +08:00 via iPhone
    r u lyx ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5686 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 01:36 · PVG 09:36 · LAX 17:36 · JFK 20:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.