Qt构建JSON及解析JSON

163,176次阅读
没有评论

共计 5869 个字符,预计需要花费 15 分钟才能阅读完成。

目录

一.JSON 简介

JSON 对象

JSON 数组

二.Qt 中 JSON 介绍 

QJsonvalue

Qt 中 JSON 对象

Qt 中 JSON 数组 

QJsonDocument

三.Qt 构建 JSON 数组

 

 四. 解析 JSON 数组


一.JSON 简介

一般来讲 C ++ 类和对象在 java 中是无法直接直接使用的,因为压根就不是一个规则。但是他们在内存中都是二进制表示的,所以把 C ++ 的类和对象转成二进制再按照 java 的规则解析这段二进制代码就可以做到 C ++ 描述的东西在 java 中复现了。但是呢涉及到底层的东西都非常复杂,直接解析二进制非常困难,所以 JSON 应运而生,JSON 是一种文本格式,文本格式相对来说比较接近人类语言规则,便于理解,同时能够将复杂的数据结构(如对象和数组)转换为一种通用的表示形式,使得不同语言之间的数据交换变得可行简化了各种语言数据之间的转换解析。JSON 的作用可以通俗地举个例子,比如我有一个俄罗斯朋友,他不会中文,我不会俄文,所以我们之间写信既不能用中文也不能用俄文。但是我们都会英文,所以我可以把原先写好的中文信按照中文翻译成英文的规则翻译成英文,他接收到信件后可以按照英文翻译成俄文的规则进行解析阅读。所以 JSON 就是个桥梁中间过渡作用,便于不同语言之间数据的传输和交换。

JSON 全称 JavaScript Object Notation,JSON 的名称中包含“JavaScript”,这表明它最初是为 JavaScript 设计的。JSON 的语法是基于 JavaScript 的对象字面量表示法,因此它与 JavaScript 的结构非常相似,但是现在基本上和 js 没什么太大的关系了,规则早就独立出来了,基本上所有语言都支持 JSON 格式的构建和解析,不是 js 一家独有。

二.JSON 格式

先来举个简单的例子

JSON 一般来讲就 JSON 对象和 JSON 数组两种格式

JSON 对象

JSON 对象一般是以花括号包起来的 {},里面成员都是键值对的形式。键必须是字符串类型,值可以是各种别的类型,也可以再嵌套一层 JSON 对象或者 JSON 数组。

JSON 数组

JSON 数组一般是以中括号包起来的 [],里面的成员可以是各种不同的类型,包括:整型、浮点型、字符串、布尔类型、JSON 数组、JSON 对象

举个例子

{  
  "name": "Alice",  
  "age": 30,  
  "isStudent": false,  
  "courses": [  
    {  
      "courseName": "Mathematics",  
      "credits": 3,  
      "instructor": {  
        "name": "Dr. Smith",  
        "email": "smith@example.com"  
      }  
    },  
    {  
      "courseName": "Physics",  
      "credits": 4,  
      "instructor": {  
        "name": "Dr. Johnson",  
        "email": "johnson@example.com"  
      }  
    }  
  ]  
}

首先上面例子中整体是一个 JSON 对象因为最外层是花括号,JSON 对象只能是键值对,这个 JSON 键值对有 4 个,键分别为 name、age、isStudent、courses,courses 的值为 JSON 数组类型,这个数组类型包了两个 JSON 对象,其中键为 courseName、credits、instructor, 而 instructor 又是一个 JSON 对象,键为 name 和 email

Qt 构建 JSON 及解析 JSON

二.Qt 中 JSON 介绍 

QJsonvalue

QJsonValue 是一个可以持有多种 JSON 数据类型的值(如对象、数组、字符串、数字、布尔值和空值)的容器。这种设计使得 QJsonObject 和 QJsonArray 能够以统一的方式处理这些不同类型的值,而不需要为每个可能的类型提供单独的接口。

常见的成员函数

构造函数

QJonvalue 支持多种类型构造,包括 null 空值构造(例子里的最后一个),所以在 JSON 对象和 JSON 的成员函数里如果有用到 QJonvalue 的是可以直接填自己常用的类型直接隐式类型转换的

Qt 构建 JSON 及解析 JSON

判断内部封装是什么类型的函数

Qt 构建 JSON 及解析 JSON

类型转换

Qt 构建 JSON 及解析 JSON

Qt 中 JSON 对象

Qt 中用 Qobject 类来表示 JSON 对象

常见的成员函数如下

大部分成员函数都与 C ++ 的容器类差不多

构造函数及拷贝构造

Qt 构建 JSON 及解析 JSON

赋值 

Qt 构建 JSON 及解析 JSON

迭代器

Qt 构建 JSON 及解析 JSON

查找

一般都只会用到第一个 QString 类型的 key 值去查找

Qt 构建 JSON 及解析 JSON

 插入

 与容器插入也类似,如果插入的键 key 原本就存在,那么它的值会自动覆盖。如果是插入新的键值对会直接插入到对象中,但是是无序插入,不一定新的键值对就在对象的最末尾。Qt 中没给指定迭代器 insert 插入

Qt 构建 JSON 及解析 JSON

删除

删除有两种方式,迭代器删除或者直接给键的名称 remove 删除

Qt 构建 JSON 及解析 JSON

Qt 构建 JSON 及解析 JSON

重载方括号

此处的重载方括号是便于根据键去找值,所以方括号里面填的不是数组下标而是键的名称

Qt 构建 JSON 及解析 JSON

通过 key 值得到 value

Qt 构建 JSON 及解析 JSON

遍历 key

这个是获取所有键名称的,得到的键名称会直接放到 QStringList 中,与上面的通过 key 值得到 value 配合就可以知道所以键值对的情况了

Qt 构建 JSON 及解析 JSON

举个打印键值对的例子

 Qt 构建 JSON 及解析 JSON

Qt 中 JSON 数组 

Qt 中用 QJsonArray 类来表示 JSON 数组,内部类型都为 QJsonvalue

常见的成员函数

构造及拷贝构造

Qt 构建 JSON 及解析 JSON

添加插入数组元素

追加的形式添加元素

Qt 构建 JSON 及解析 JSON

尾插及头部插入

Qt 构建 JSON 及解析 JSON

 insert 指定位置插入

Qt 构建 JSON 及解析 JSON

获取元素值

获取头部的值

Qt 构建 JSON 及解析 JSON

获取尾部的元素值

Qt 构建 JSON 及解析 JSON 

获取指定位置的值

Qt 构建 JSON 及解析 JSON 

Qt 构建 JSON 及解析 JSON 

删除元素

头删尾删

Qt 构建 JSON 及解析 JSON 

Qt 构建 JSON 及解析 JSON 

删除指定位置元素

Qt 构建 JSON 及解析 JSON 

Qt 构建 JSON 及解析 JSON 

QJsonDocument

QJsonDocument 封装了一个完整的 JSON 文档,可以从 utf- 8 编码的基于文本的表示,以及 Qt 本身的二进制格式读取和写入该文档

前面的 QJsonObject 对象和 QJsonArray 可以当作 QJsonDocument 的一部分,不过整体处理还是通过 QJsonDocument 来进行处理的。使用 QJsonDocument::fromJson 方法解析 JSON 字符串或文件时,它会根据 JSON 数据的内容(是对象还是数组)来决定返回一个包含 QJsonObject 还是 QJsonArray 的 QJsonDocument 实例。然后,你可以检查返回的 QJsonDocument 是否包含对象或数组,并相应地将其转换为 QJsonObject 或 QJsonArray 进行进一步处理。构建 JSON 文件时也是对 QJsonDocument 对象进行转换

成员函数

构造函数可以通过 JSON 对象或者 JSON 数组直接构造

Qt 构建 JSON 及解析 JSON

构建 JSON 字符串常用的函数

将 QJsonDocument 转成 JSON 字符串或者二进栈字符串

第一个是二进栈文件,第二、三都是转成 JSON 文件

Qt 构建 JSON 及解析 JSON 

解析 JSON 文件常用的函数

解析 JSON 文件一般分为两步,第一步是将 JSON 文件转换成 QJsonDocument

第一种是从二进制数据的文档中解析 JSON 字符串,QJsonDocument::DataValidation validation(可选):指定数据验证的级别。默认是 QJsonDocument::Validate,意味着会进行完整的验证,这个一般都是自动补齐的,一般都用不到,直接用默认的就可以了。

第二种是从 JSON 格式的文本文件中解析 JSON 字符串,QJsonParseError *error(可选):指向 QJsonParseError 对象的指针,用于在解析过程中捕获错误信息这个也是直接用就可以了

Qt 构建 JSON 及解析 JSON

第二步是将 QJsonDocument 文件具体解析成具体的 QJsonArray 或者 QJsonObject

与之相关的是先判断是数组还是对象然后才能具体解析

Qt 构建 JSON 及解析 JSON

Qt 构建 JSON 及解析 JSON 

最后将 QJsonDocument 具体转换成  QJsonArray 或者 QJsonObject

Qt 构建 JSON 及解析 JSON

Qt 构建 JSON 及解析 JSON

 

三.Qt 构建 JSON 数组

 

{  
  "name": "Alice",  
  "age": 30,  
  "isStudent": false,  
  "courses": [  
    {  
      "courseName": "Mathematics",  
      "credits": 3,  
      "instructor": {  
        "name": "Dr. Smith",  
        "email": "smith@example.com"  
      }  
    },  
    {  
      "courseName": "Physics",  
      "credits": 4,  
      "instructor": {  
        "name": "Dr. Johnson",  
        "email": "johnson@example.com"  
      }  
    }  
  ]  
}

怎么将上面的 JSON 语句用 Qt 构建出来呢,可以利用 JSON 解析工具来理清结构 JSON 在线解析、格式化、校验工具 (jsontool.cn)

正常未折叠是这样的

Qt 构建 JSON 及解析 JSON

然后从上图可以看出来最外围是个对象,所以直接先构建一个 QJsonObject 对象出来

可以直接实例化也可以 new 对象出来,但是 new 出来一定要在最后释放掉

Qt 构建 JSON 及解析 JSON

接着要处理 JsonObject 里面的东西了,但是因为有很多嵌套其实不好看清结构的,所以可以借助在线解析工具将一些暂时用不到的结构折叠起来

 Qt 构建 JSON 及解析 JSON

从上图可以看出来 JsonObject 第二层有 name,age,isStudent,courses 四个东西,其中 courses 的值是 QJsonArray 类型,可以要晚点处理,不能直接插入,但是剩余的三个都是正常的键值对,所以直接插入 JsonObject 里就可以了

Qt 构建 JSON 及解析 JSON

而对 courses 的处理,先构造出 QJsonArray 空数组出来,然后再一步步往里面插东西

Qt 构建 JSON 及解析 JSON

 展开 courses 可以看出来里面是两个 QJsonObject 类型的 Json 对象

Qt 构建 JSON 及解析 JSON

先处理第一个 Object 对象,也是先实例化出来

Qt 构建 JSON 及解析 JSON 

然后展开第一个 Object 看看里面的样子

Qt 构建 JSON 及解析 JSON 

从上图可以看出来前两个直接插入就可以了,而第三个成员又嵌套了一个 Object 对象,所以也得特殊处理,当 instructor 全部处理完了才能插入 courses1 中

Qt 构建 JSON 及解析 JSON 

courses2 的操作与 courses1 操作类似所以就不多加赘述了

Qt 构建 JSON 及解析 JSON 

courses2 处理完了就代表 array 处理完了,所以进行下一步插入操作了

Qt 构建 JSON 及解析 JSON 

完整代码如下

    QJsonObject* JsonObject=new QJsonObject();
     JsonObject->insert("name","Alice");
     JsonObject->insert("age","30");
     JsonObject->insert("isStudent","false");
     
     //courses 数组处理
     QJsonArray array;
     
     //courses 数组中第一个对象
     QJsonObject courses1;
     courses1.insert("courseName","Mathematics");
     courses1.insert("credits",3);
     
     QJsonObject instructor;   //courses1 这个对象里面又嵌套了对象,所以也得特殊处理
     instructor.insert("name","Dr. Smith");
     instructor.insert("email","smith@example.com");
     courses1.insert("instructor",instructor);// 处理完了进行插入
     
     //courses 数组中第二个对象
     QJsonObject courses2;
     courses2.insert("courseName","Physics");
     courses2.insert("credits",4);
     QJsonObject instructor2;
     instructor2.insert("name","Dr. Johnson");
     instructor2.insert("email","johnson@example.com");
     courses2.insert("instructor",instructor2);
     
     array.push_back(courses1);//JsonArrary 数组插入数据
     array.push_back(courses2);
     JsonObject->insert("courses",array);//array 里面的成员全部处理完了,插入最外层对象
     // 当不再需要 JsonObject 时,使用 delete 删除它  
     delete JsonObject;  

 构建完了后转换成 QJsonDocument,然后转换成 JSON 格式,打印一下看看内容

Qt 构建 JSON 及解析 JSON

Qt 构建 JSON 及解析 JSON

最后直接保存到文件里 

Qt 构建 JSON 及解析 JSON

 四. 解析 JSON 数组

一种解析方法是递归进行处理,不过打印出来是无序的,因为 JSON 对象本来就是无序的。不过因为太复杂了,而且容易出问题,如果是直接 JSON 文件是可以打开看到基本的 JSON 结构的,而从 API 接收数据一般会给一个 JSON 格式案例的,所以直接对照案例解析就可以了,递归是在完全不知道要解析 JSON 文件的格式的情况下才选择的

// 递归处理 JSON 数据
void parseJsonValue(const QJsonValue &value) {if (value.isObject()) {
        // 如果是对象,直接打印键值对
        QJsonObject obj = value.toObject();
        for (QString key : obj.keys()) {QJsonValue val = obj.value(key);
            // 直接打印键值对
            if (val.isBool()) {qDebug() setupUi(this);
    QFile file("E:/Qt/q/content/untitled15/teacher.json");
        if (!file.open(QFile::ReadOnly | QFile::Text)) {qDebug() 

 如果已经知道了格式该怎么解析

还是老演员例子

Qt 构建 JSON 及解析 JSON

直接按图索骥,直接用键打印值就行

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 
#include 
#include 

// Widget 类的构造函数
Widget::Widget(QWidget *parent)
    : QWidget(parent) // 调用基类的构造函数
    , ui(new Ui::Widget) // 初始化 UI 界面
{ui->setupUi(this); // 设置 UI 界面

    // 打开 JSON 文件
    QFile file("E:/Qt/q/content/untitled15/teacher.json");
    if (!file.open(QFile::ReadOnly)) { // 如果文件打开失败
        qDebug() 

 Qt 构建 JSON 及解析 JSON

原文地址: Qt 构建 JSON 及解析 JSON

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-10-07发表,共计5869字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)