前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qt5 中的 Json 模块与 JsonCpp 的对比

Qt5 中的 Json 模块与 JsonCpp 的对比

作者头像
Harper
发布2021-07-27 09:55:21
1.5K0
发布2021-07-27 09:55:21
举报
文章被收录于专栏:Harper的碎碎念

工作中有幸做过关于 Qt5 Json 模块向 Qt4 的移植。做过有关 Qt JsonJsonCpp 的对比,并做过相关的兼容工作。所以着重研究了一下有关 Json 解析器的相关内容。注:大家常说的 QJson 其实并不是 Qt 中的模块,而是在 Qt4 没有 Json 模块的年代,一个非官方的第三方模块。对于现在 Qt 中的 Json 模块,官方称之为 Qt Json

其实 Qt5 中的 Qt Json 模块的代码,写的可以说是严格按照 ECMA-404 协议的解析范本,没有任何自己画蛇添足的逻辑。而相比之下,JsonCpp 就相当随意了,作为一个非常有个性的解析器,是当之无愧了。以至于从 JsonCpp 换到 Qt Json 着实要做些兼容工作。

二者的细节对比:

Qt Json

  1. 不支持C/C++风格注释,解析失败
  2. 不支持0123456这种数值解析
  3. 不支持QJsonValue、QJsonDocument的直接比较大小(支持判断相等和不等)
  4. 允许设置默认值,不抛异常。没有设置默认值的,无法转换成功返回空值。
  5. 错误信息不可定位到具体行列
  6. Json文本最大不能超过128MB(超过会爆DocumentTooLargeError)
  7. 最大不能超过1024层嵌套(超过会爆DeepNestingError) (以上两个限制都是写死在代码的,可以改掉,但是改掉限制以后。是否有其他问题暂不清楚)
  8. qDebug下支持直接输出 Qt Json 的相关对象

JsonCpp

  1. 支持C/C++风格注释,可以选择是否解析注释,可以允许设置和获取注释(然而在FastWriter的情况下不会输出注释)
  2. 支持0123456这种数值的解析
  3. 支持JsonValue的直接比较
  4. 不允许设置默认值,对于无法转换成功的,直接抛异常
  5. 错误信息可以定位到具体行列

对于二者的效率,只用了 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 解析,而且在性能上会比较拔群。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二者的细节对比:
    • Qt Json
      • JsonCpp
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档