Qt利用QJson实现解析数组的示例详解

目录
  • 前言
  • 第一步:进行数据转换
  • 第二步:将字符串转成QJsonDocument格式
  • 第三步:解析json数据

前言

现在有这样一个json结构,需要使用QJson来解析,结构如下:

	"code": "0001",
	"descrip": "文本描述1详细描述",
	"id": "1",
	"title": "文本1标题",
	"type": 0,
	"paths": ["E:/3.json", "F:/11.txt"]
}, {
	"code": "0002",
	"descrip": "文本描述2详细描述",
	"id": "2",
	"title": "文本2标题",
	"type": 0,
	"paths": ["E:/AndroidSetting.png", "E:/build.png", "F:/C++工程.png", "F:/build完成.png"]
}, {
	"code": "00040003",
	"descrip": "文本",
	"id": "3",
	"title": "文本3标题",
	"type": 0,
	"paths": ["F:/native-lib文件分析.png", "F:/编辑工程.png"]
}]

直接是一组json数组,连个关键字也没有,这样的数据该如何解析呢?

假设这些数据是存储在std::string串中,那么对以上字符串进行解析~

第一步:进行数据转换

将字符串解析成QJson识别的格式,第一步少不了QJsonDocument::fromJson函数的转换,在QJsonDocument类中,该函数的定义如下:

static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error = nullptr);

参数是QByteArray类型。

第一步要做的工作就是如何将std::string转成QByteArray类型

QString qsJson = QString::fromLocal8Bit(sJson.c_str());
QByteArray qsArray = qsJson.toUtf8().data();

在这里,需要注意的是,QString转成QByteArray时,一定是使用toUtf8而不是toLocal8Bit,否则在将字符串解析成QJsonDocument时,无法解析成功!

第二步:将字符串转成QJsonDocument格式

QJsonParseError stError;
QJsonDocument jsonDoc = QJsonDocument::fromJson(qsJson.toUtf8().data(), &stError);
if (stError.error != QJsonParseError::NoError)
{
	QString qsError = stError.errorString();
}
if (jsonDoc.isNull())
{
	return false; //json结构解析失败
}

代码讲解:

为了防止在解析中出现错误而不知道是哪种原因时,就用到了QJsonParseError类,一旦发现字符串解析失败,就可以获取错误原因,方便我们在程序开发时进行查找。

第三步:解析json数据

首先,将QJsonDocument转成QJsonArray结构

QJsonArray jsArrays =  jsonDoc.array();

其次,遍历数据。与普通的STL的遍历方式一致,采用for循环方式,拿去下标下对应的数据

for(int i = 0; i < jsArrays.count(); i++)
{
    QJsonValue valueArrayObject = jsArrays.at(i);
    if (valueArrayObject.type() != QJsonValue::Object)
    {
	continue;
    }
    QJsonObject jsArrayValue = valueArrayObject.toObject();
    QJsonValue jsCode = jsArrayValue.value("code");
    QString qsCode = jsCode.toString();
}

代码解析:

上述代码流程:

1:读取数组下标数据

2:判断当前第i个数据的类型是不是json类型,此时,不是,不需要后续操作

3:类型转换

4:实际的json数据解析

上述只是用"code"做示例,其它的参数也如同code参数的解析方式一致,就不再过多说明了。但是需要注意,在读取下标、判断类型、类型转换这三步骤操作一定是要做的。

对于"paths"中仅有字符串的结构,该如何解析呢?

此时,就省略了第二步、第三步操作,直接将下标对应的json结构解析就可以了

QJsonValue valuePathObject = jsUrlArray.at(m); //获取数组下标数据 QString qsPath = valuePathObject.toString();

到此这篇关于Qt利用QJson实现解析数组的示例详解的文章就介绍到这了,更多相关Qt QJson解析数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Qt实现模糊匹配功能的实例详解

    目录 1.准备基础数据 2.创建并实例化匹配类 3.控件绑定 对于浏览器的使用,我想大家一定不会陌生吧,输入要搜索的内容时,会出现相应的匹配信息. 那么,今天我要讲述的也是这样一个功能. 首先看一下展示效果 输入任意文本后,弹出具有该文本的符合项,也就是模糊查询. 实现功能的核心是:QCompleter 该类可以在任何Qt小部件中提供自动完成搜索功能,例如:QLineEdit.QComboBox.当输入指定字符后,QCompleter会根据单词列表提供的内容进行筛查. 在这里,我是采用QLine

  • Qt实现小功能之圆形进度条的方法详解

    目录 功能 图形绘制 1.绘制窗口整体背景色值 2.圆形进度条通道绘制 3.圆形进度条绘制 4.文本绘制 数值计算 1.计算步长 2.实时数据计算 在Qt自带的控件中,只有垂直进度条.水平进度条两种. 在平时做页面开发时,有些时候会用到圆形进度条,比如说:下载某个文件的下载进度. 展示效果,如下图所示: 实现这个功能主要由以下几个重点: 1:图形绘制 2:数值计算 也算是一个初级例子,下面我来讲解下如何实现这个简单的小功能吧! 功能 自定义绘制类:QRoundedProgress 继承自QWid

  • Qt实现小功能之复杂抽屉效果详解

    目录 功能讲解 自定义标题widget 标题名称控件的创建 QCheckBox控件的创建 自定义内容Widget 创建显示高度描述控件 QScrollArea中widget实现 QScrollArea子窗口的提升 在Qt自带的控件中,也存在抽屉控件:QToolBar.但是,该控件有个缺点:一次只能展开一个抽屉信息,无法实现多个展开.为此,实现了如下效果的程序: 下面对这种实现效果进行讲解~ 功能讲解 开发环境:VS2017 + Qt5.14.2 64位 实现的核心技术: 1:QScrollAre

  • Qt实现打地鼠游戏的方法详解

    目录 功能讲解 1.确定地鼠数量 2.定义游戏难易程序 3.难度切换 4.定时器处理 总结 今天与大家分享一个小游戏的实现:打地鼠 看一下实现效果吧~ 在指定的时间内打中一定数额的地鼠,否则失败,就如上述展示效果一样,自己写的小程序,居然连第二关也过不去,还挺尴尬的! 实现打地鼠小游戏不难,最主要的核心就是依靠定时器,按照一定间隔触发.接下来,我来讲解下是如何实现的吧! 功能讲解 开发环境:VS2017 + Qt5.14.2 x64 1.确定地鼠数量 对于打地鼠这款游戏来说,地鼠是从任意的洞口钻

  • Qt利用QJson实现解析数组的示例详解

    目录 前言 第一步:进行数据转换 第二步:将字符串转成QJsonDocument格式 第三步:解析json数据 前言 现在有这样一个json结构,需要使用QJson来解析,结构如下: "code": "0001", "descrip": "文本描述1详细描述", "id": "1", "title": "文本1标题", "type&quo

  • java 与testng利用XML做数据源的数据驱动示例详解

    java 与testng利用XML做数据源的数据驱动示例详解 testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本.在这以XML为例: 备注:@DataProvider的返回值类型只能是Object[][]与Iterator<Object>[] TestData.xml: <?xml version="1.0" encoding="UTF-8"?> <

  • Qt利用QDrag实现拖拽拼图功能详解

    目录 一.项目介绍 二.项目基本配置 三.UI界面设置 四.主程序实现 4.1 main.cpp 4.1 mainwindow.h头文件 4.2 mainwindow.cpp源文件 4.3 PiecesList类 4.4 PuzzleWidget类 五.效果演示 一.项目介绍 本文介绍利用QDrag类实现拖拽拼图功能.左边是打散的图,拖动到右边进行复现,此外程序还支持手动拖入原图片. 二.项目基本配置 新建一个Qt案例,项目名称为“puzzle”,基类选择“QMainWindow”,取消选中创建

  • 利用Pygame制作简单动画的示例详解

    目录 前言 计时器 绘制精灵 加载精灵 完整代码 前言 实现一个帧动画,使用的一个图,根据不同的时间显示不同的图. 使用的就是如下所示的一张图,宽度780 * 300 ,使用加载图片 260 * 150来实现. pygame.init() screen = pygame.display.set_mode((400, 300), 0, 32) pygame.display.set_caption("动画") while True: for event in pygame.event.ge

  • 利用Python创建位置生成器的示例详解

    目录 介绍 开始 步骤 创建训练数据集 创建测试数据集 将合成图像转换回坐标 放在一起 结论 介绍 在这篇文章中,我们将探索如何在美国各地城市的地图数据和公共电动自行车订阅源上训练一个快速生成的对抗网络(GAN)模型. 然后,我们可以通过为包括东京在内的世界各地城市创建合成数据集来测试该模型的学习和概括能力. git clone https://github.com/gretelai/GAN-location-generator.git 在之前的一篇博客中,我们根据电子自行车订阅源中的精确位置数

  • 利用Python自动生成PPT的示例详解

    在日常工作中,PPT制作是常见的工作,如果制作创意类PPT,则无法通过自动化的形式生成,因为创意本身具有随机性,而自动化解决的是重复性工作,两者有所冲突. python-pptx是python处理PPT的一个库,注重的是读和写,无法导出,没有渲染功能. 废话不多说,第一步,安装python-pptx库: pip3 install -i https://pypi.doubanio.com/simple/ python-pptx ppt里面处理的主要对象一般为文本框,表格,图片. 每一页的ppt为一

  • 利用IntersectionObserver实现动态渲染的示例详解

    目录 前言 实现 懒加载组件 长列表组件示意 测试 前言 开发表格时,希望支持可视后的动态加载.在查找资料做了一些尝试后,最终使用IntersectionObserver,相对方便地实现了该功能 IntersectionObserver诞生已经有几年了,所以它的兼容性目前已经达到可以使用的程度了.具体兼容程度以及详细API可参考CDN 实现 懒加载组件 核心就是利用了IntersectionObserver的能力,封装了LazyContainer组件,该组件的children,只有在视口中可见时

  • 利用Python实现智能合约的示例详解

    目录 智能合约 1. 是什么 2. 使用场景 用Python如何实现 1. 设计智能合约 2. 编写智能合约源代码 3. 编译智能合约 4. 部署智能合约 5. 调用智能合约方法 6. 监控智能合约事件 7. 升级智能合约 智能合约 1. 是什么 智能合约是一种由计算机程序编写的自动化合约,它可以在没有第三方干预的情况下执行交易和契约条款.智能合约使用区块链技术实现,可以实现不同的功能,例如交易.投票.代币发放和数据存储等.智能合约的执行是基于其代码的逻辑,并且在既定条件满足时自动执行.智能合约

  • 利用Python如何生成hash值示例详解

    一.介绍 如果在Python中需要对用户输入的密码或者其他内容进行加密,首选的方法是生成hash值. 在Python中可以利用二个模块来进行: - crypt - hashlib 二.crypt (一)crypt的主要方法和常量 名称 描述 md5(-) 利用md5算法加密 sha1(-) 利用sha1算法加密 sha224(-) 利用sha224算法加密 sha256(-) 利用sha256算法加密 sha384(-) 利用sha384算法加密 sha512(-) 利用sha512算法加密 (

  • 利用Swift如何计算文本的size示例详解

    前言 对于swift 还处于摸索阶段很多语法还不熟悉,本文主要给大家介绍的是关于利用Swift计算文本size的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. iOS 11之前限制宽高计算字符串的size用的是UILabel的textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect方法,当时也没考虑线程安全问题(low爆了),Xcode也没提示,用了好

随机推荐