C/C++ Qt 运用JSON解析库的实例代码

下面将为您详细讲解在C/C++ Qt中运用JSON解析库的实例代码的完整攻略。

一、JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON建立在两种结构上:一个用来表示值的简单原始类型(数字、字符串、布尔值、空值)以及一种集合值的有序列表(数组)和一个包含属性的名称/值对的各异性集(对象)。

关于JSON的更多详细信息,请参考 JSON官方网站

二、Qt的JSON解析库

在C/C++ Qt中,使用JSON解析库需要引用Qt的<QtJson/QtJson>头文件,并调用库提供的类来解析JSON格式数据。

三、JSON解析类

Qt提供了两个JSON解析类:QJsonParseError和QJsonDocument。

  • QJsonParseError

QJsonParseError类表示JSON解析过程中发生的出错信息。当调用QJsonDocument::fromJson()方法解析JSON格式数据时,如果解析过程中发生错误,则返回一个QJsonParseError对象,该对象包含了出错的相关信息。

QJsonParseError类定义在头文件<QJsonParseError>中,其主要成员包括error,offset和errorString。

  • error:一个枚举类型值,描述了错误类型。可能的值包括如下项:

    • QJsonParseError::NoError:表示没有错误
    • QJsonParseError::UnterminatedObject:表示对象/数组没有正常结束
    • QJsonParseError::MissingNameSeparator:表示属性缺少冒号分隔符
    • QJsonParseError::UnterminatedArray:表示数组元素没有正常结束
    • QJsonParseError::ValueInvalid:表示值无效
    • QJsonParseError::TerminationByNumber:表示数字以意外的字符终止
    • QJsonParseError::IllegalValue:表示值不是字符串、数字、对象、数组或布尔值
    • QJsonParseError::TerminationByToken:表示未正确关闭字符串或注释
    • QJsonParseError::ObjectNotEmpty:表示对象中有重复的名称
    • QJsonParseError::InvalidEscapeSequence:表示字符串中有无效的转义序列
    • QJsonParseError::MissingValueSeparator:表示属性缺少逗号分隔符
    • QJsonParseError::DeepNesting:表示JSON的嵌套层数过深
    • QJsonParseError::DocumentTooLarge:表示解析的JSON文档超过预定义的限制
  • offset:表示错误信息出现的位置。

  • errorString:包含错误信息的字符串。

  • QJsonDocument

QJsonDocument类表示JSON格式的文档对象。通常,QJsonDocument类的实例表示QJsonObject或QJsonArray对象的根元素。该类提供了两种从JSON格式的字符串和Qt数据类型之间进行转换的静态成员函数:

函数名称 说明
QJsonDocument.fromJson(const QByteArray &data, QJsonParseError *error = nullptr) 将包含JSON格式的data转换成QJsonDocument对象,并返回转换结果。如果出现解析错误,则通过error参数返回错误信息。
QByteArray QJsonDocument.toJson(QJsonDocument::JsonFormat format = QJsonDocument::Indented) 将QJsonDocument对象转换成JSON格式的字符串,并返回转换结果。format参数指定了JSON格式的输出方式:Indented表示以缩进格式输出,Compact表示以紧凑格式输出。

四、JSON解析实例

这里给出两个解析JSON数据的例子:

示例一:解析JSON格式的数据

示例JSON数据:

{
  "name": "Tom",
  "age": 24,
  "married": false,
  "hobbies":["music","swimming","reading"],
  "address": {
    "province":"Guangdong",
    "city":"Shenzhen",
    "street":"Nanshan"
  }
}

代码如下:

#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>

int main()
{
    QString json = "{\"name\":\"Tom\",\"age\":24,\"married\":false,\"hobbies\":[\"music\",\"swimming\",\"reading\"],\"address\":{\"province\":\"Guangdong\",\"city\":\"Shenzhen\",\"street\":\"Nanshan\"}}";
    QJsonParseError error;
    QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8(), &error);
    if (error.error != QJsonParseError::NoError)
    {
        qDebug() << "Parse error: " << error.errorString();
    }
    QJsonObject obj = doc.object();
    qDebug() << "name: " << obj["name"].toString();
    qDebug() << "age: " << obj["age"].toInt();
    qDebug() << "married: " << obj["married"].toBool();
    QJsonArray hobbies = obj["hobbies"].toArray();
    qDebug() << "hobbies: ";
    foreach(QJsonValue hobby, hobbies)
    {
        qDebug() << "    " << hobby.toString();
    }
    QJsonObject address = obj["address"].toObject();
    qDebug() << "address: " << address["province"].toString() << address["city"].toString() << address["street"].toString();
    return 0;
}

运行结果为:

name:  "Tom"
age:  24
married:  false
hobbies: 
     "music"
     "swimming"
     "reading"
address:  "Guangdong" "Shenzhen" "Nanshan"

示例二:从文件读取JSON数据

示例JSON文件:data.json

{
  "name": "John",
  "age": 33,
  "married": true,
  "hobbies":["football","basketball","baseball"],
  "address": {
    "province":"Guangxi",
    "city":"Nanning",
    "street":"Chengbei"
  }
}

代码如下:

#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>
#include <QFile>

int main()
{
    QFile file("data.json");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug() << "Cannot open file for reading.";
        return -1;
    }
    QString json = file.readAll();
    file.close();
    QJsonParseError error;
    QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8(), &error);
    if (error.error != QJsonParseError::NoError)
    {
        qDebug() << "Parse error: " << error.errorString();
    }
    QJsonObject obj = doc.object();
    qDebug() << "name: " << obj["name"].toString();
    qDebug() << "age: " << obj["age"].toInt();
    qDebug() << "married: " << obj["married"].toBool();
    QJsonArray hobbies = obj["hobbies"].toArray();
    qDebug() << "hobbies: ";
    foreach(QJsonValue hobby, hobbies)
    {
        qDebug() << "    " << hobby.toString();
    }
    QJsonObject address = obj["address"].toObject();
    qDebug() << "address: " << address["province"].toString() << address["city"].toString() << address["street"].toString();
    return 0;
}

运行结果和上一示例相同。

以上就是关于C/C++ Qt运用JSON解析库的实例代码的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++ Qt 运用JSON解析库的实例代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 微信小程序使用uni-app开发小程序及部分功能实现详解

    微信小程序使用uni-app开发小程序及部分功能实现详解 一、uni-app简介 uni-app是DCloud提供的一款跨平台开发框架,可以通过一套代码在不同平台上运行(H5、小程序、APP)。该框架采用Vue.js作为前端开发框架,并提供了一系列的API和插件,让程序开发更加简单。 二、微信小程序使用uni-app开发 1. 安装uni-app 在命令行工…

    C 2023年5月23日
    00
  • C语言如何建立动态链表问题

    建立动态链表是C语言中常见的数据结构应用之一。以下是如何建立动态链表的完整攻略: 步骤一:定义链表结构 首先需要定义一个链表结构体,包括节点数据和指向下一个节点的指针。 typedef struct Node { int data; struct Node *next; } Node; 步骤二:创建头结点 链表的头结点是链表的入口,不存储数据,只存储链表中第…

    C 2023年5月23日
    00
  • C++ Strassen算法代码的实现

    C++ Strassen算法代码的实现 什么是Strassen算法? Strassen算法是一种矩阵乘法的优化算法,它将两个矩阵的乘法分解为若干个小矩阵的乘法,从而减少了矩阵乘法的计算次数。 具体来说,将两个$n\times n$的矩阵$A$和$B$分别划分成四个$\dfrac{n}{2}\times\dfrac{n}{2}$的矩阵: $$A = \begi…

    C 2023年5月23日
    00
  • C++实现学生信息管理系统

    C++ 实现学生信息管理系统的攻略可以分为以下几个步骤: 1. 界面设计 学生信息管理系统需要一个良好的界面来提供用户友好的使用体验。可以使用如 Qt 等界面框架,或者使用C++标准库提供的基本控制台界面来实现。 2. 数据存储与处理 信息管理系统需要能够存储和处理学生信息,可以选择使用文件、数据库或者数据结构等来完成。 2.1 文件存储 使用文件存储数据是…

    C 2023年5月23日
    00
  • 学生成绩管理系统C++实现代码

    下面我来为大家详细讲解“学生成绩管理系统C++实现代码”的完整攻略。 1. 程序设计思路 这个程序的主要功能是对学生成绩的管理,具体来说包括以下功能:- 添加学生信息- 修改学生信息- 删除学生信息- 查找学生信息- 以各种方式展示学生信息列表 接下来,我将会详细介绍这些功能各自的实现。 2. 添加学生信息 要实现添加学生信息的功能,我们需要定义一个结构体来…

    C 2023年5月24日
    00
  • MySQL数据库操作DQL正则表达式

    MySQL数据库操作DQL正则表达式可以帮助我们更高效地检索数据库中的数据,本文将详细讲解如何使用正则表达式进行MySQL数据库的数据检索。 什么是正则表达式 正则表达式是一种文本模式,用于匹配字符串中的一部分或整个字符串。它是在很多编程语言中都可用的工具,用于匹配、查找和替换文本。 在MySQL中,可以使用正则表达式进行模糊查询和根据一定的规则来查询数据。…

    C 2023年5月22日
    00
  • C++实现简单的通讯录管理系统

    下面我来详细讲解“C++实现简单的通讯录管理系统”的完整攻略。 系统概述 通讯录管理系统是一个简单的信息管理系统。该系统可以实现以下功能: 添加联系人 显示联系人 删除联系人 查找联系人 修改联系人 清空联系人 退出通讯录管理系统 系统实现过程 设计流程 分析需求,确定功能模块 绘制流程图,确定各模块的处理流程 完成代码实现 运行测试 编写代码 首先,我们需…

    C 2023年5月23日
    00
  • Linux系统下C语言gets函数出现警告问题的解决方法

    以下是详细讲解 “Linux系统下C语言gets函数出现警告问题的解决方法”的完整攻略。 1. gets函数警告问题 在 Linux 系统下使用 C 语言进行编程时,我们有时会使用 gets 函数,但是这种函数在读取字符串时很容易造成缓冲区溢出,导致程序崩溃。因此,编译器会提示警告信息,防止程序出错。 下面是使用 gets 函数的示例代码: #include…

    C 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部