项目需要解析和构造JSON格式的数据,由于项目使用C++编程,所以比较了一下基于C/C++的开源JSON解析库。当前,差不多40多种基于C/C++的开源JSON库在使用,经过一番比较,最终决定在RapidJson和cJSON中选择一个。下面是对这两个库的一个比较详细的对比。
1 C/C++ JSON库列表
Github上的项目nativejson-benchmark(https://github.com/miloyip/nativejson-benchmark)从性能和对JSON标准的支持程度两个维度对40多种基于C/C++的开源JSON库进行了benchmark对比。同时也列出了这40多个库的信息。这里列出它们的简要信息:
Library | Language | Version | Notes |
C++ | 5.6.6 | ||
C++ | 2.0.3 | ||
C++11 | v2.8.0 | Need Boost on non-Windows platform. DOM strings must be UTF16 on Windows and UTF8 on non-Windows platform. | |
C | |||
C | 1.5.0 | ||
C++ | 2015-12-18 | gcc/clang only | |
C++11 | |||
C | 0.5.3 | ||
C++ | Not parsing number per se, so do it as post-process. | ||
C++11 | 2016.08.29.00 | Need installation | |
C++11 | |||
C | v2.7 | ||
C++14 | |||
C | 0.12.1 | ||
C++11 | 0.97.1 | ||
C++ | v1.1.1 | ||
C++ | 4.08 | Need Boost | |
C++ | 0.6.2 | ||
C++ | 1.0.0 | ||
C++ | |||
C | Not parsing number per se, so do it as post-process. | ||
C++ | v1.0.0 | gcc/clang only | |
C++ | v2-1 | ||
C++11 | |||
C++11 | v2.0.3 | ||
C | |||
C++ | 1.3.0 | ||
C | No numbers parsing, no DOM interface | ||
C++ | 1.7.5 | Need installation | |
C | 1.0.0 | gcc/clang only | |
C++ | 5.6.1-1 | Need installation | |
C++ | v1.1.0 | There are four configurations: RapidJSON (default), RapidJSON_AutoUTF (transcoding any UTF JSON), RapidJSON_Insitu (insitu parsing) & RapidJSON_FullPrec (full precision number parsing) | |
C++ | |||
C++ | |||
C | Not parsing number per se, so do it as post-process. | ||
udp/json | C | 1.1.0 | Actually 2 libraries: udp/json-parser & udp/json-builder. |
C++11 | 1.0.0-beta.7 | Uses PEGTL for parsing | |
C++ | |||
C++ | 2015-04-12 | ||
C | |||
C++ | 5.1.281.47 | Need installation | |
C | 0.8 | ||
C | 2.1.0 | ||
C++ | v1.4.2 | Need building: (./configure --disable-shared && make) |
2 Benchmark比较
详细的数据可以参见https://github.com/miloyip/nativejson-benchmark/tree/master/sample
下面从对JSON标准的支持程度,内存占用,执行时间,库的大小几个维度进行了benchmark比较。
2.1 对JSON标准的支持程度
下图是各个开源库对JSON标准的支持程度的benchmark数据, 数值越大越好。
2.2 解析JSON内存使用情况对比
2.3 解析JSON使用时间对比
2.4 生成JSON使用时间对比
2.5 修改JSON使用时间对比
2.6 代码量大小对比
2.7总结
从以上比较可以看出,RapidJson除了代码量上占绝对优势为,其他方面都是绝对的领先。
3 RapidJson和cJSON比较
比较项目 | RapidJson | cJSON |
github | https://github.com/Tencent/rapidjson | https://github.com/DaveGamble/cJSON |
Star数量 | 10.7K | 5.6K |
语言及接口 | C++,提供面向对象接口,使用方便 | C,面向过程的接口,使用不太方便 |
使用方式 | 只有头文件 | 虽然需要编译,但是只有两个文件 |
是否支持字符串中间有 | 支持 | 不支持 |
支持的字符编码 | 支持 UTF-8、UTF-16、UTF-32 编码,包括小端序和大端序 | 只支持UTF-8 |
浮点数支持 | 支持所有浮点类型 | 不支持double类型 |
API 风格 | 支持SAX和DOM | 只支持DOM |
是否支持流操作 | 支持,若 JSON 存储在文件中,文件流可减少 JSON 解析及生成所需的内存量 | 不支持 |
是否支持JSON Pointer | 支持 | 不支持 |
是否支持JSON Schema校验 | 支持 | 不支持 |
经过上面的比较,显然RapidJson比cJSON功能上丰富很多,而且易于使用。