分享一个小而美的 json-parser

2023-06-22 23:18:53 +08:00
 holmes1412

前阵子 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

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

1622 次点击
所在节点    C
1 条回复
monkeyNik
2023-09-14 13:40:27 +08:00
r u lyx ?

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

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

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

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

© 2021 V2EX