Qt Json详细介绍

一.概念介绍

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输和存储。它具有以下特点:

  1. 易读性:JSON 使用人类可读的文本格式表示数据,采用键值对的方式组织数据,易于阅读和编辑。

  2. 轻量级:JSON 数据格式较为简洁,不包含冗余信息,适合网络传输和存储。

  3. 自描述性:JSON 数据的结构清晰明了,键值对以及数组的嵌套结构能够清晰地表示复杂数据。

  4. 易于解析:JSON 数据可以方便地被解析成多种编程语言中的数据结构,如对象、数组等。

  5. 跨平台兼容:由于 JSON 是一种文本格式,不依赖特定的编程语言,能够被多种编程语言解析和生成。

JSON 数据通常由对象(Object)和数组(Array)组成:

  • 对象(Object):由一组键值对构成,使用大括号 {} 表示。示例:{“name”: “Alice”, “age”: 30}
  • 数组(Array):由一组值构成,使用中括号 [] 表示。数组中的元素可以是对象、数组或基本数据类型。示例:[“apple”, “banana”, “cherry”]

总之,JSON 是一种简单、轻量级、易读的数据交换格式,被广泛应用于 Web 开发、API 设计和数据交换等领域。通过了解 JSON 的基本概念和语法规则,可以更好地进行数据交互与处理。

二.重要的部分介绍

1. QJsonDocument:

  • QJsonDocument 类用于表示整个 JSON 文档,可以包含一个 JSON 对象或一个 JSON 数组。
  • 可以使用该类来创建、读取、写入和操作 JSON 数据。
  • 成员函数:toJson() 将 JSON 文档转换为字符串,fromJson() 从字符串中解析 JSON 数据。

示例代码如下:

#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建 JSON 对象
    QJsonObject personObject;
    personObject["name"] = "Alice";
    personObject["age"] = 30;
    personObject["isStudent"] = true;

    QJsonArray fruitsArray = {"apple", "banana", "cherry"};
    personObject["favoriteFruits"] = fruitsArray;

    QJsonObject addressObject;
    addressObject["city"] = "New York";
    addressObject["zipcode"] = "10001";
    personObject["address"] = addressObject;

    // 将 JSON 对象转换为 JSON 文档
    QJsonDocument jsonDocument(personObject);

    // 将 JSON 文档转换为 JSON 字符串
    QString jsonString = jsonDocument.toJson();

    qDebug() << "Generated JSON string:" << jsonString;

    // 解析 JSON 字符串为 JSON 文档
    QJsonDocument parsedDocument = QJsonDocument::fromJson(jsonString.toUtf8());

    if (!parsedDocument.isNull() && parsedDocument.isObject()) {
        QJsonObject parsedObject = parsedDocument.object();

        QString name = parsedObject["name"].toString();
        int age = parsedObject["age"].toInt();
        bool isStudent = parsedObject["isStudent"].toBool();

        qDebug() << "Parsed name:" << name;
        qDebug() << "Parsed age:" << age;
        qDebug() << "Parsed isStudent:" << isStudent;
    } else {
        qDebug() << "Failed to parse JSON";
    }

    return a.exec();
}

2.QJsonObject(这和map很相似)

  • QJsonObject 类用于表示 JSON 对象,它是键值对的集合,其中键为字符串,值可以是字符串、整数、布尔值、对象或数组。
  • 可以通过下标操作符 [] 或 insert() 方法来添加键值对。
  • 成员函数:value() 可以获取指定键对应的值,contains() 用于检查是否包含指定键。

示例代码如下:

#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建一个空的 JSON 对象
    QJsonObject personObject;

    // 添加键值对到 JSON 对象
    personObject["name"] = "Alice";
    personObject["age"] = 30;
    personObject["isStudent"] = true;

    // 创建包含一组值的 JSON 数组
    QJsonArray fruitsArray = {"apple", "banana", "cherry"};
    personObject["favoriteFruits"] = fruitsArray;

    // 创建一个嵌套的 JSON 对象
    QJsonObject addressObject;
    addressObject["city"] = "New York";
    addressObject["zipcode"] = "10001";
    personObject["address"] = addressObject;

    // 访问和输出 JSON 对象中的值
    qDebug() << "Name:" << personObject["name"].toString();
    qDebug() << "Age:" << personObject["age"].toInt();
    qDebug() << "Is Student:" << personObject["isStudent"].toBool();

    // 访问嵌套的 JSON 对象中的值
    QJsonObject nestedAddress = personObject["address"].toObject();
    qDebug() << "City:" << nestedAddress["city"].toString();
    qDebug() << "Zipcode:" << nestedAddress["zipcode"].toString();

    // 修改 JSON 对象中的值
    personObject["age"] = 35;

    // 移除 JSON 对象中的某个键值对
    personObject.remove("isStudent");

    // 转换 JSON 对象为字符串
    QJsonDocument jsonDocument(personObject);
    QString jsonString = jsonDocument.toJson();

    qDebug() << "Updated JSON object:" << jsonString;

    return a.exec();
}

3. QJsonArray

  • QJsonArray 类用于表示 JSON 数组,它是值的有序集合,值可以是字符串、整数、布尔值、对象或数组。
  • 可以使用 append()、insert()、at() 等方法操作数组元素。
  • 成员函数:size() 返回数组中元素的数量,at() 根据索引获取指定位置的元素。
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建一个空的 JSON 数组
    QJsonArray fruitsArray;

    // 向 JSON 数组添加元素
    fruitsArray.append("apple");
    fruitsArray.append("banana");
    fruitsArray.append("cherry");

    // 创建一个包含多个不同类型元素的 JSON 数组
    QJsonArray mixedArray;
    mixedArray.append(10);
    mixedArray.append(true);
    mixedArray.append("hello");

    // 输出数组元素
    qDebug() << "Fruits in the array:";
    for(const QJsonValue &value : fruitsArray) {
        qDebug() << value.toString();
    }

    qDebug() << "Elements in mixed array:";
    for(const QJsonValue &value : mixedArray) {
        if(value.isBool()) {
            qDebug() << value.toBool();
        } else if(value.isDouble()) {
            qDebug() << value.toDouble();
        } else if(value.isString()) {
            qDebug() << value.toString();
        }
    }

    // 访问数组元素
    qDebug() << "First fruit:" << fruitsArray.at(0).toString();
    qDebug() << "Last fruit:" << fruitsArray.last().toString();

    // 修改数组元素
    fruitsArray.replace(1, "pear");

    // 移除数组元素
    fruitsArray.removeAt(2);

    // 转换 JSON 数组为字符串
    QJsonDocument jsonDocument(fruitsArray);
    QString jsonString = jsonDocument.toJson();

    qDebug() << "Updated JSON array:" << jsonString;

    return a.exec();
}

4.JSON 数据的解析

  • 使用 QJsonDocument::fromJson() 将 JSON 字符串解析为 QJsonDocument 对象。
  • 判断解析后的对象类型(是对象还是数组),然后获取各个属性的值。

5. QString与QByteArray

在 Qt 中,QString 和 QByteArray 是两种用于处理字符串数据的类,它们在存储和操作字符串上有一些不同之处。下面是关于 QString 和 QByteArray 的详细介绍:

QString

  • QString 是 Qt 中用于表示 Unicode 字符串的类,它支持多种字符编码,包括 UTF-8、UTF-16 等。

  • 特点:

  1. 支持 Unicode 字符,可以表示任意国家地区的字符。
  2. 自动转码:QString 会自动处理不同字符编码之间的转换。例如,可以使用 toUtf8() 方法将 QString 转换为 QByteArray。
  3. 提供了丰富的字符串操作方法,如拼接、查找、替换、大小写转换等。

使用场景:

  • 存储用户界面文本、表示用户输入。
  • 作为跨平台的字符串处理工具,便于处理各种字符编码和国际化需求。

QByteArray

  • QByteArray 是 Qt 中用于表示字节数据的类,通常用于存储二进制数据或者不包含特定字符编码的文本数据。

特点:

  1. 与 QString 不同,QByteArray 主要是字节级别的操作,适用于处理二进制数据。
  2. 通常用于读写文件、网络数据、加密解密等场景。
  3. 字节数据一般不涉及字符编码的转换,更适合存储不特定编码的数据。

使用场景:

  • 存储二进制数据,如图片、音频、视频等。
  • 读写文件内容,处理网络数据传输。
  • 加密解密操作等需要处理字节数据的场景。

总结

  • 如果需要处理文本数据,并且涉及到字符串操作、多语言支持或者用户界面相关的文本处理,通常使用 QString。

  • 如果处理的数据为字节数据、二进制数据或者不需要特定字符编码的数据,可以使用 QByteArray。

三.JSON读写文件实战

  • Json格式如下:
{
    "Name":"Ace",
    "Sex":"man",
    "Age":20,
    "Family":{
        "Father":"Gol·D·Roger",
        "Mother":"Portgas·D·Rouge",
        "Brother":["Sabo", "Monkey D. Luffy"]
    },
    "IsAlive":false,
    "Comment":"yyds"
}
  • 写文件
void MainWindow::writeJson()
{
    //创建一个Json对象
    QJsonObject obj;//对象可以说是和map一模一样

    //"Ace"发生了隐式类型转换
    obj.insert("name","Ace");
    obj.insert("sex","man");
    obj.insert("age",20);

    //创建子对象
    QJsonObject subObj;
    subObj.insert("father","Gol·D·Roger");
    subObj.insert("Mother","Portgas·D·Rouge");


    //构建一个Json数组的对象
    QJsonArray array;
    array.append("Sabo");
    array.append("Monkey D. Luffy");
    subObj.insert("Brother",array);

    obj.insert("Family",subObj);

    obj.insert("IsAlive",false);

    obj.insert("Comment","yyds");


    //将json的对象转换成文档类型
    QJsonDocument doc(obj);

    //将其转换成字符串类型,QByteArray在qt中就是表示字符串
    QByteArray json = doc.toJson();

    //写入磁盘文件中
    QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");

    file.open(QFile::WriteOnly);

    file.write(json);

    file.close();


}
  • 读文件
void MainWindow::readJson()
{
    //读文件
    QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");

    file.open(QFile::ReadOnly);

    QByteArray all = file.readAll();

    file.close();

    //读出的文件进行转换
    QJsonDocument doc = QJsonDocument::fromJson(all);

    if(doc.isObject())
    {
         QJsonObject obj = doc.object();
         QStringList keys = obj.keys();
         for(int i=0; i<keys.size(); ++i)
         {
             QString key = keys.at(i);
             QJsonValue value = obj.value(key);
             if(value.isBool())
             {
                 qDebug() << key << ":" << value.toBool();
             }
             if(value.isString())
             {
                 qDebug() << key << ":" << value.toString();
             }
             if(value.isDouble())
             {
                 qDebug() << key << ":" << value.toInt();
             }
             if(value.isObject())
             {
                 qDebug()<< key << ":";
                  // 直接处理内部键值对, 不再进行类型判断的演示
                 QJsonObject subObj = value.toObject();
                 QStringList ls = subObj.keys();
                 for(int i=0; i<ls.size(); ++i)
                 {
                     QJsonValue subVal = subObj.value(ls.at(i));
                     if(subVal.isString())
                     {
                          qDebug() << "   " << ls.at(i) << ":" << subVal.toString();
                      }
                     if(subVal.isArray())
                     {
                         QJsonArray array = subVal.toArray();
                         qDebug() << "   " << ls.at(i) << ":";
                         for(int j=0; j<array.size(); ++j)
                         {
                             // 因为知道数组内部全部为字符串, 不再对元素类型进行判断
                             qDebug() << "       " << array[j].toString();
                          }
                      }
                  }
              }
          }
      }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/772723.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP家政服务预约单开版微信小程序系统源码

&#x1f3e0; —— 便捷生活&#xff0c;从指尖开始&#x1f4aa; &#x1f308;【开篇&#xff1a;家政新风尚&#xff0c;一键触达】 在忙碌的生活节奏中&#xff0c;你是否渴望拥有一个温馨、整洁的家&#xff0c;却又苦于找不到合适的家政服务&#xff1f;现在&#xff…

C++_03

1、构造函数 1.1 什么是构造函数 类的构造函数是类的一种特殊的成员函数&#xff0c;它会在每次创建类的新对象时执行。 每次构造的是构造成员变量的初始化值&#xff0c;内存空间等。 构造函数的名称与类的名称是完全相同的&#xff0c;并且不会返回任何类型&#xff0c;也不…

对标GPT-4o!不锁区、支持手机、免费使用,Moshi来啦!

7月4日凌晨&#xff0c;法国知名开源AI研究实验室Kyutai在官网发布了&#xff0c;具备看、听、说多模态大模型——Moshi。 Moshi功能与OpenAI在5月14日展示的最新模型GPT-4o差不多&#xff0c;可以听取人的语音提问后进行实时推理回答内容。但GPT-4o的语音模式要在秋天才能全面…

适合弱电行业的项目管理软件!找企智汇软件!

随着科技的不断发展&#xff0c;弱电行业对于项目管理的需求日益增强。为满足这一需求&#xff0c;企智汇推出了一款专为弱电行业打造的工程项目管理系统。 企智汇弱电行业工程项目管理系统以其专业性、高效性和智能性&#xff0c;赢得了业界的广泛认可。该系统深入融合了弱电…

仓库管理系统

create database Warehouse_management;//建库 use Warehouse_management; 一、建表 1、管理员信息表 CREATE TABLE ManagerInfo (Mno CHAR(3) PRIMARY KEY,Mname VARCHAR(10) NOT NULL,Mgender CHAR(1) DEFAULT 男,Mbirhdate DATE,Mtelephone CHAR(11) NOT NULL,Mhiredate …

数据预处理:统计关联性分析/数据清洗/数据增强/特征工程实例

专栏介绍 1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。 2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。 3.需要强调的是,专栏仅介绍主…

C++(第四天----拷贝函数、类的组合、类的继承)

一、拷贝构造函数&#xff08;复制构造函数&#xff09; 1、概念 拷贝构造函数&#xff0c;它只有一个参数&#xff0c;参数类型是本类的引用。如果类的设计者不写拷贝构造函数&#xff0c;编译器就会自动生成拷贝构造函数。大多数情况下&#xff0c;其作用是实现从源对象到目…

Access,Trunk,Hybrid网络设备链接类型详解

带着问题找答案&#xff1a;网络链路上的数据包怎么看&#xff0c;是否携带vlan-id如何看&#xff0c;以及如何设计链接类型满足用户要求&#xff0c;请看如下解析。 第一种&#xff1a;链接类型access 无标记数据帧 第二种&#xff1a;链接类型trunk 第三种&#xf…

最新mysql打开远程访问和修改最大连接数

这里写目录标题 1.使用navicat进入命令控制板,进入use mysql;2.查询用户表3.更新user表中root用户域属性&#xff0c;%表示允许外部访问4.执行以上语句之后再执行&#xff0c;FLUSH PRIVILEGES;5. 执行授权语句修改最大连接数 1.使用navicat进入命令控制板,进入use mysql; use…

为什么写Python脚本时要加上if __name__ == ‘__main__‘?

目录 一、__name__ 的秘密 二、if __name__ __main__: 的作用 三、代码示例与案例分析 示例一&#xff1a;简单的数学工具模块 示例二&#xff1a;命令行工具 四、实际应用场景 五、进阶应用 1. 插件开发 2. 动态加载模块 3. 交互式与脚本模式切换 六、结论 在Pyth…

电商API对接流程丨从零开始快速打通电商平台数据通道

开发电商业务管理系统时&#xff0c;怎么对接电商接口呢&#xff1f;有两种方式可供选择&#xff0c;一种方式就是自己入驻想要对接的电商平台对应的开放平台&#xff0c;按照要求与流程与电商接口进行对接&#xff0c;还有一种方式就是寻找电商中台&#xff0c;通过第三方接口…

吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.5-2.6

目录 第三门课 结构化机器学习项目&#xff08;Structuring Machine Learning Projects&#xff09;第二周&#xff1a;机器学习策略&#xff08;2&#xff09;(ML Strategy (2))2.5 数据分布不匹配时的偏差与方差的分析&#xff08;Bias and Variance with mismatched data di…

玩机进阶教程----MTK芯片杂牌机 小品牌机型解除bl锁以及root的操作步骤解析

在玩机过程中会遇到很多小品牌机型或者杂牌机类的。大多都使用mtk芯片。而且基本很少有官方线刷包。在这些机型中玩机首先我们要想办法导出系统来制作线刷包。以免后续解锁bl或者root出现未知故障可以恢复原系统。 那么对于这些机型该如何进行备份固件和root呢。通过博文可以初…

选微调、RAG还是微调+RAG?

RAG技术是一种结合了检索与生成的方法。它通常依赖于两个核心组件&#xff1a;一个大型语言模型&#xff08;如GPT-3&#xff09;和一个检索系统&#xff08;如向量数据库&#xff09;。RAG先使用检索系统从大量数据中检索出相关信息&#xff0c;然后将这些信息提供给语言模型&…

一文带你看懂什么是营销归因模型及SaaS企业的应用

在数字化时代&#xff0c;营销活动的多样性和复杂性使得评估其效果成为一项挑战。营销归因模型应运而生&#xff0c;为SaaS企业等提供了科学、系统的评估工具。本文将简要介绍什么是营销归因模型&#xff0c;阐述其带来的好处&#xff0c;并探讨SaaS企业可以采用的营销归因系统…

编译rust程序,并让它依赖低版本的GLIBC库

在linux环境下编译rust程序&#xff0c;编译好的程序会依赖你当前系统的GLIBC库&#xff0c;也就是说你的程序无法在使用更低版本GLIBC库的linux系统中运行。 查看当前系统的GLIBC版本&#xff1a; strings /lib64/libc.so.6 | grep GLIBC 为了让编译的程序依赖比较低版本的GL…

通过 Power Automate 以提升的权限运行 Power Apps 连接

使用Power Apps在Sharepoint列表中新建或编辑项比较简单&#xff0c;就是创建窗体&#xff0c;连接Sharepoint列表&#xff0c;添加个按钮&#xff0c;触发条件为Submit(form)。 填写信息&#xff0c;点击按钮即可新建项 但使用过程中&#xff0c;发现运行此应用的用户&#xf…

mac 11 变编译安装nginx

mac 11 变编译安装nginx 记录一次安装过程 所需要的包 pcre: https://sourceforge.net/projects/pcre/files/pcre/OpenSSL: https://www.openssl.org/source/Nginx: https://nginx.org/en/download.html如果没有pcre 和Openssl,报错如下 把pcre和Openssl 解压到nginx 目录下…

MySQL数据库的备份-恢复-日志

一、备份 1.1数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中&#xff0c;数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。 1.2造成数据丢失的原因 程序错误人为操作错误运算错误磁盘故障灾难&#xff08;如火灾、地震&#xff09;和盗窃 1.3数…

Altium Designer专业PCB设计软件下载安装 Altium Designer安装包下载获取

在电子设计的广袤领域中&#xff0c;PCB设计无疑占据着重要的地位。而Altium Designer作为一款业界领先的电子设计自动化软件&#xff0c;其提供的先进布局工具&#xff0c;无疑为设计师们打开了一扇通往高效、精确设计的大门。 在PCB设计的核心环节——布局中&#xff0c;Alti…