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日

相关文章

  • 酷派大神F1电信版怎么样?酷派大神F1电信版体验全面评测

    酷派大神F1电信版怎么样?酷派大神F1电信版体验全面评测 1. 硬件配置 酷派大神F1电信版搭载了高通骁龙8核处理器,并配备了3GB RAM和32GB ROM的存储空间,支持128GB的扩展存储。电池容量达到2900mAh,支持快速充电功能,可以快速满电。 2. 屏幕与外观 酷派大神F1电信版采用了一块5.5英寸1280×720分辨率的IPS屏幕,显示效果比…

    C 2023年5月22日
    00
  • C++实现简单迷宫游戏

    C++实现简单迷宫游戏攻略 介绍 迷宫游戏是一种很有趣的益智游戏,在这个游戏中,玩家需要解决迷宫中的难题,找到通往出口的路线。本攻略将提供一个简单的迷宫游戏实现过程,使用 C++ 编程语言实现。 在这个项目中,我们将学习如何使用类、条件语句、循环和数组等 C++ 编程语言的基本语法和概念。在游戏中,我们将使用控制台窗口来创建一个命令行界面,玩家可以通过键盘操…

    C 2023年5月23日
    00
  • SQLite教程(十四):C语言编程实例代码(2)

    下面我将为你详细讲解“SQLite教程(十四):C语言编程实例代码(2)”的完整攻略。 SQLite教程(十四):C语言编程实例代码(2) 在这个教程中,我们将继续介绍SQLite在C语言中的应用。本文将分享两个C语言编程实例代码,分别是插入数据和查询数据。 插入数据 首先,我们需要通过C语言的sqlite3 API打开数据库: sqlite3 *db; i…

    C 2023年5月22日
    00
  • C/C++如何实现两矩阵相乘之模拟法

    C/C++实现两矩阵相乘,模拟法是一种常见且直观的方法。该方法的基本思想是:根据矩阵乘法公式,将一个矩阵转置,再对两个矩阵进行逐个元素的相乘,最终得到一个新的矩阵。以下是详细的步骤和示例说明: 1. 创建两个矩阵 需要创建两个矩阵,以便进行相乘的操作。可以采用二维数组的形式来表示一个矩阵,如下所示: int matrix1[3][3] = { {1, 2, …

    C 2023年5月23日
    00
  • word文档中怎么插入公式? word插入公式的两种方法

    当我们需要在 Word 文档中插入公式时,可以通过以下两种方法: 方法一:使用公式编辑器 首先,选择想要插入公式的位置,然后点击 Word 菜单中的 “插入” 标签; 在 “插入” 标签下,选择 “公式” 选项卡; 点击 “公式” 选项卡下的 “新建公式” 按钮,将弹出公式编辑器窗口; 在公式编辑器窗口中,在上下两栏之间输入公式并编辑; 单击 “确定” 按钮…

    C 2023年5月22日
    00
  • C++对象内存分布详解(包括字节对齐和虚函数表)

    C++中的对象在内存中的分布,对于理解C++的语法和特性非常重要。在本文中将讲解C++对象内存分布的相关知识,包括内存分配、字节对齐、虚函数表等内容。 内存分配 C++中的对象是在内存中动态分配的,通过运算符new来进行内存动态分配。例如,以下是一个动态分配对象的示例代码: class MyClass { public: int i; double d; v…

    C 2023年5月22日
    00
  • C++ 如何使用栈求解中缀、后缀表达式的值

    C++ 中,我们可以使用栈来求解中缀表达式的值或者先将中缀表达式转换为后缀表达式再进行求解。下面我将演示如何使用栈求解中缀表达式的值和后缀表达式的值。 求解中缀表达式的值 步骤 创建两个栈,一个用于存储操作数,另一个用于存储运算符。 从左到右遍历中缀表达式。 如果当前字符是数字,则入操作数栈。 如果当前字符是运算符,则与运算符栈中的栈顶运算符比较,如果当前运…

    C 2023年5月23日
    00
  • 使命召唤手游怎么赚c币 C币获取方法一览

    使命召唤手游怎么赚C币:C币获取方法一览 什么是C币? C币是使命召唤手游中的虚拟货币,可以用来购买游戏内道具和装备。 C币获取方法 1. 完成任务 游戏中会有一些每日和成就任务,每完成一项可获得一定数量的C币作为奖励。在任务界面查看任务并完成就可以领取奖励。 2. 参加活动 游戏官方会举办一些活动,参加活动并完成指定要求可以获取C币奖励。活动类型包括临时活…

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