工作中有幸做过关于 Qt5 Json 模块向 Qt4 的移植。做过有关 Qt Json 与 JsonCpp 的对比,并做过相关的兼容工作。所以着重研究了一下有关 Json 解析器的相关内容。注:大家常说的 QJson 其实并不是 Qt 中的模块,而是在 Qt4 没有 Json 模块的年代,一个非官方的第三方模块。对于现在 Qt 中的 Json 模块,官方称之为 Qt Json 。
其实 Qt5 中的 Qt Json 模块的代码,写的可以说是严格按照 ECMA-404 协议的解析范本,没有任何自己画蛇添足的逻辑。而相比之下,JsonCpp 就相当随意了,作为一个非常有个性的解析器,是当之无愧了。以至于从 JsonCpp 换到 Qt Json 着实要做些兼容工作。
对于二者的效率,只用了 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 解析,而且在性能上会比较拔群。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
如有侵权,请联系 cloudcommunity@tencent.com 删除。
一个 Windows 客户端匠人的碎碎念