前阵子 Workflow 的作者为项目写了个 1000 行代码量级的json-parser,比较典雅精致。
其中可以学习到 C 语言中经典的编码风格、递归解析的架构、简洁的接口设计,并且也非常方便引入项目中作为轻量级的 json 解析器。
由于已经在 Workflow 项目中使用,所以代码质量和开源项目的长期投入都有保证~~~
因此也来和小伙伴分享一下>w<
👉 https://github.com/Barenboim/json-parser
1 、 基于ANSI-C,完整支持 ECMA-404 json 标准;
2 、 轻量级:只有json_parser.h和json_parser.c,依赖只有 linux 内核中的两个经典数据结构 rbtree.h 和 list.h ;
3 、 高性能:虽然不是最快的,但实测性能大概是cJSON的1.5 倍,jsoncpp的10 倍左右;
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
每一个模块单独拎出来都很好玩,感兴趣的话也可以围观~~~