Qt5 中的 Json 模块与 JsonCpp 的对比
工作中有幸做过关于 Qt5 Json 模块向 Qt4 的移植。做过有关 Qt Json 与 JsonCpp 的对比,并做过相关的兼容工作。所以着重研究了一下有关 Json 解析器的相关内容。注:大家常说的 QJson 其实并不是 Qt 中的模块,而是在 Qt4 没有 Json 模块的年代,一个非官方的第三方模块。对于现在 Qt 中的 Json 模块,官方称之为 Qt Json。
其实 Qt5 中的 Qt Json 模块的代码,写的可以说是严格按照 ECMA-404 协议的解析范本,没有任何自己画蛇添足的逻辑。而相比之下,JsonCpp 就相当随意了,作为一个非常有个性的解析器,是当之无愧了。以至于从 JsonCpp 换到 Qt Json 着实要做些兼容工作。
二者的细节对比:
Qt Json
- 不支持C/C++风格注释,解析失败
- 不支持0123456这种数值解析
- 不支持QJsonValue、QJsonDocument的直接比较大小(支持判断相等和不等)
- 允许设置默认值,不抛异常。没有设置默认值的,无法转换成功返回空值。
- 错误信息不可定位到具体行列
- Json文本最大不能超过128MB(超过会爆DocumentTooLargeError)
- 最大不能超过1024层嵌套(超过会爆DeepNestingError) (以上两个限制都是写死在代码的,可以改掉,但是改掉限制以后。是否有其他问题暂不清楚)
- qDebug下支持直接输出 Qt Json 的相关对象
JsonCpp
- 支持C/C++风格注释,可以选择是否解析注释,可以允许设置和获取注释(然而在FastWriter的情况下不会输出注释)
- 支持0123456这种数值的解析
- 支持JsonValue的直接比较
- 不允许设置默认值,对于无法转换成功的,直接抛异常
- 错误信息可以定位到具体行列
对于二者的效率,只用了 JsonCpp 项目中的测试用例跑过,结果证明 Qt Json 性能会好大概3-5倍。而且对于 Qt 项目来说, JsonCpp 那种解析错误就抛异常的,显然有点激进了,利用 Qt 的信号和槽就优雅了很多。但是由于 Qt 开发人员的懒惰,使用递归来进行解析,导致对 Json 数据的嵌套层数有要求,算是一个遗憾。不过客户端应用也够用了。
工作中对 JsonCpp 的兼容也只是兼容了 JsonCpp 的第1、2条。对 Qt Json 模块只要改 parse 部分。而 Qt Json 的 parse 是一个状态机,代码也通俗易懂,改起来还是不难的。另外一部分内容就是 Qt5 Json 向 Qt4 移植,这块的话,还是要稍微看一下源码,改动的话需要调整 Qt4 中的 QString 以及 QAtomicInt 中的一些原子操作,主要是一些琐碎细节,没啥特色,也就不表了。
很遗憾的是这两个库都只支持 DOM 解析
论专业性,还是 RapidJson 好一点,还支持 SAX 解析,而且在性能上会比较拔群。