Qt5 中的 Json 模块与 JsonCpp 的对比

news/2025/2/12 4:46:47/

注:大家常说的 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 解析,而且在性能上会比较拔群。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓


http://www.ppmy.cn/news/3712.html

相关文章

springMVC+mysql实现的Java web图书管理系统源码+运行教程+参考论文

今天给大家演示的是一款由srpingMVC实现的Java web图书管理系统,本项目功能非常丰富,且附带配套论文及视频指导配置运行教程,系统实现的功能主要有:图书馆里、图书分类管理、出版社管理、图表图书统计展示、用户管理、角色管理、权…

win7无损合并分区,win7合并磁盘分区

电脑的操作系统是win7的,如果磁盘分区太小或者说磁盘分区不合理,需要对磁盘分区重新分区,其中合并磁盘分区就是解决方法之一,那么,有没有关于win7无损合并分区的操作方法呢? 一、利用Windows自带的功能来合…

SSM整合

SSM整合 1、准备工作 ①创建Maven Module ②导入依赖 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.c…

记录-链表头插尾插区别

链表作为数据结构中比较重要的一种&#xff0c;具有操作效率高、内存利用率高、结构简单、使用方便等特点&#xff0c;今天我们一起交流一下单向线性表的头插法和尾插法的区别及优缺点 线性表因为每个元素都包含一个指向下一元素的指针&#xff0c;所以新增、删除、修改起来非…

Jenkins Pipeline Kubernetes 如何创建 Pod

Jenkins Pipeline & Kubernetes 如何创建 pod 文章目录Jenkins Pipeline & Kubernetes 如何创建 pod1. 前言2. Jenkins 插件2.1 安装 Kubernets Plugin2.2 安装 Docker Plugin2.3 安装 Git Plugin3. Jenkins 配置 kubernetes credentials4. Jenkins 连接 minikube 集群…

android 和风图标字体移植显示墨迹天气图标

android studio版本&#xff1a;21.2.1 例程&#xff1a;newareaautov1 和风天气字体图标使用方法见&#xff1a; android 显示和风天气字体图标_kim5659的博客-CSDN博客_qweather-icons 之前做了个全自动获取天气的app,用的是墨迹的接口&#xff08;实际是科大讯飞再接入墨…

2022-12-15 c++总结

文章目录c学习之路&#xff08;总结篇&#xff09;持续更新基本概念理解关于.h .hpp .cpp的理解namespace和#ifdef的理解封装成dll和lib区别stdafx.h和stdafx.cpp全局变量global和静态变量static区别main函数的参数argc&#xff0c;argv类型含义理解符号变量const和define枚举类…

为什么感觉现在很少有黑客了?

有一个词语&#xff0c;人人不是它&#xff0c;却人人都提及它&#xff0c;他就是&#xff1a;黑客&#xff01; 黑客&#xff0c;这个我们从小就接触的工种&#xff0c;总是衣服全身黑衣、眼戴墨镜、冷酷无情、超级厉害的形象&#xff0c;关键是&#xff0c;只要应用崩了/数据…