【QT】——QJson类的使用

news2024/9/9 0:33:47

目录

1.Json的格式

1.1.Json数组

1.2.Json对象

2.QJson

2.1 QJsonObject

2.2 QJsonValue

2.3 QJsonArray

2.4 QJsonDocument

3.示例

3.1 写操作

3.2 读操作


1.Json的格式

Json的基本概念

Json 是一种数据格式,和语言无关,在什么语言中都可以使用 Json,Json一般处理两种任务:

  • 组织数据(数据序列化),用于数据的网络传输
  • 组织数据(数据序列化),写磁盘文件实现数据的持久化存储(一般以.json 作为文件后缀)

Json中主要两种数据格式:Json数组,和Json 对象

1.1.Json数组

  • Json 数组使用 [] 表示,[] 里边是元素,元素和元素之间使用逗号间隔,最后一个元素后边没有逗号。
  • Json支持多种数据类型,包括:整形、 浮点型、 字符串、 布尔类型、 json数组、 json对象、 空值-null。
  • Json数组中的数据可以一致,也可以不一致
//数据一致
// 整形
[1,2,3,4,5]
// 字符串
["lisi", "haha", "xxx", "nihao", "robin"]

//数据不一致:
["lisi", 1, null, 1.1, "robin"]


//Json数组嵌套使用,Json数组中可以有Json数组
[
   ["lisi", 1, null, 1.1, "robin"],
   [1,2,3,4,5],
   ["lisi", "haha", "xxx", "nihao", "robin"],
   "lisa"
]

1.2.Json对象

  • Json 对象使用 {} 来描述,每个 Json 对象中可以存储若干个元素,每一个元素对应一个键值(key:value 结构) 。
  • 键值(key)必须是字符串,位于同一层级的键值不能重复(因为是通过键值取出对应的 value 值)
  • value 值的类型是可选的,可根据实际需求指定,可用类型包括:整形、 浮点、 字符串、 布尔类型、 json数组、 json对象、 空值-null

{
    "Name":"lisa",
     "Age":20,
    
    //Family中的value值是一个Json对象
    "Family":{
        "Father":"Gol·D·Roger",
        "Mother":"Portgas·D·Rouge",
        "Brother":["Sabo", "Monkey D. Luffy"]
    },
    "IsAlive":false,
    "Comment":"yyds"
}


错误案例:

// test.json
{
    "name":"lisa",
    "age":19
}
{
    "user":"lisi",
    "passwd":"123456"
}

在一个 Json 文件中只能有一个 Json 数组或者 Json 对象的根节点,不允许同时存储多个并列的根节点

2.QJson

  1. QJsonDocument:它封装了一个完整的 JSON 文档,并且可以从 UTF-8 编码的基于文本的表示以及 Qt 自己的二进制格式读取和写入该文档
  2. QJsonArray:QJsonArray是QT中的JSON 数组的类型。可以通过从数组中插入和删除 QJsonValue 来操作该列表。
  3. QJsonObject :QJsonObject是是QT中的Json对象类型,其中键是唯一的字符串,值由 QJsonValue 表示。
  4. QJsonValue:该类封装了 JSON 支持数据类型,是key-value中的 value类型。

2.1 QJsonObject

QJsonObject 封装了 Json 中的对象,在里边可以存储多个键值对.

下面是常用的接口函数:

//构造函数
QJsonObject::QJsonObject();	// 构造空对象

//将键值对插入到json对象中
iterator QJsonObject::insert(const QString &key, const QJsonValue &value);

//删除键值对,通过key值进行删除
void QJsonObject::remove(const QString &key);
QJsonValue QJsonObject::take(const QString &key);	// 返回key对应的value值

//插值键值对
iterator QJsonObject::find(const QString &key); //返回其迭代器
bool QJsonObject::contains(const QString &key) const;//判断是否存在



//获取键值对的 对数
int QJsonObject::count() const;
int QJsonObject::size() const;
int QJsonObject::length() const;

//通过key值获取value
QJsonValue QJsonObject::value(const QString &key) const;    // utf8
QJsonValue QJsonObject::value(QLatin1String key) const;	    // 字符串不支持中文
QJsonValue QJsonObject::operator[](const QString &key) const;
QJsonValue QJsonObject::operator[](QLatin1String key) const;

//查找
iterator QJsonObject::find(const QString &key);
bool QJsonObject::contains(const QString &key) const;

遍历方式 

//获取Json对象中所有的 key值,返回到QStringList中。
QStringList QJsonObject::keys() const;

QStringList通过函数at取下标获取到各个QJsonObject每个对象的key值。

示例:
//假设object对象中有很多个键值对,然后我们需要将每个键值对给取出来
QJsonObject object;
QStringList stringlist=object.keys();

for(int i=0;i<object.size();i++)
{
  //第i个键值对
   QString key=stringlist.at(i);
   QJsonValue value=object[key];
}

2.2 QJsonValue

在 Qt 中 QJsonValue 可以封装的基础数据类型有六种(和 Json 支持的类型一致),分别为:

  • 布尔类型:QJsonValue::Bool
  • 浮点类型(包括整形): QJsonValue::Double
  • 字符串类型: QJsonValue::String
  • Json 数组类型: QJsonValue::Array
  • Json 对象类型:QJsonValue::Object
  • 空值类型: QJsonValue::Null

这些类型可以通过 QJsonValue 的构造函数被封装为一个类对象:

构造函数:
// Json对象
QJsonValue(const QJsonObject &o);
// Json数组
QJsonValue(const QJsonArray &a);
// 字符串
QJsonValue(const char *s);
QJsonValue(QLatin1String s);
QJsonValue(const QString &s);
// 整形 and 浮点型
QJsonValue(qint64 v);
QJsonValue(int v);
QJsonValue(double v);
// 布尔类型
QJsonValue(bool b);
// 空值类型
QJsonValue(QJsonValue::Type type = Null);

//判断类型
// 是否是Json数组
bool isArray() const;
// 是否是Json对象
bool isObject() const;
// 是否是布尔类型
bool isBool() const;
// 是否是浮点类型(整形也是通过该函数判断)
bool isDouble() const;
// 是否是空值类型
bool isNull() const;
// 是否是字符串类型
bool isString() const;
// 是否是未定义类型(无法识别的类型)
bool isUndefined() const;


// 转换为Json数组
QJsonArray toArray(const QJsonArray &defaultValue) const;
QJsonArray toArray() const;
// 转换为布尔类型
bool toBool(bool defaultValue = false) const;
// 转换为浮点类型
double toDouble(double defaultValue = 0) const;
// 转换为整形
int toInt(int defaultValue = 0) const;
// 转换为Json对象
QJsonObject toObject(const QJsonObject &defaultValue) const;
QJsonObject toObject() const;
// 转换为字符串类型
QString toString() const;
QString toString(const QString &defaultValue) const;

2.3 QJsonArray

QJsonArray 封装了 Json 中的数组,在里边可以存储多个元素,

QJsonArray中的所有类型的操作,都需要统一为 QJsonValue 类型。因为 QJsonValue 类型封装了各个数据类型。比如:

  • 如果QString类型对象想要插入到QJsonArray中,就需要将QString类型对象转换为QJsonValue类型,才插入到QJsonArray中。
  • 同样,从QJsonArray中获取的QString对象都是QJsonValue,通过isString判断其对象,在使用toString转换成QString对象。其他类型也是采取这种方法。

常用接口

QJsonArray::QJsonArray();

//添加元素
void QJsonArray::append(const QJsonValue &value);	// 在尾部追加
void QJsonArray::insert(int i, const QJsonValue &value); // 插入到 i 的位置之前
iterator QJsonArray::insert(iterator before, const QJsonValue &value);
void QJsonArray::prepend(const QJsonValue &value); // 添加到数组头部
void QJsonArray::push_back(const QJsonValue &value); // 添加到尾部
void QJsonArray::push_front(const QJsonValue &value); // 添加到头部

//删除元素
iterator QJsonArray::erase(iterator it);    // 基于迭代器删除
void QJsonArray::pop_back();           // 删除尾部
void QJsonArray::pop_front();          // 删除头部
void QJsonArray::removeAt(int i);      // 删除i位置的元素
void QJsonArray::removeFirst();        // 删除头部
void QJsonArray::removeLast();         // 删除尾部
QJsonValue QJsonArray::takeAt(int i);  // 删除i位置的原始, 并返回删除的元素的值


//获取数组中的个数
int QJsonArray::count() const;
int QJsonArray::size() const;


//获取最后一个元素
QJsonValue QJsonArray::at(int i) const;
QJsonValue QJsonArray::first() const; // 头部元素
QJsonValue QJsonArray::last() const; // 尾部元素
QJsonValueRef QJsonArray::operator[](int i);

2.4 QJsonDocument

在QT中,从文件中或从网络中读取的数据是 QJson的字符流,这种字符流则用QJsonDocument来表示。

一张图表示QJsonDocument与QJsonObject 对象/QJsonArray对象的关系:

  •  文件或者网络中进行传输的数据都是 字符流,如果是Json格式的字符流,则称为Json格式的字符流.
  • 所以我们将封装好的QJsonObject 对象或者QJsonArray对象的数据 在与 文件/网络 传输之前,都需要将转换QJsonDocument对象,QJsonDocument对象在转换为QJson字符流进行传输。

常用的接口:

//将QJsonObject对象转换为QJsonDocument
QJsonDocument::QJsonDocument(const QJsonObject &object);
//将QJsonArray对象转换为QJsonDocument
QJsonDocument::QJsonDocument(const QJsonArray &array);

//将文件对象中的数据进行序列化
// 二进制格式的json字符串
QByteArray QJsonDocument::toBinaryData() const;	 
// 文本格式
QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const;	

//从网络或者文件中读取到字符串
//将字符串转换为QJsonDocumment类型
[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
// 参数文件格式的json字符串
[static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);


// 判断文档对象中存储的数据是不是Json数组
bool QJsonDocument::isArray() const;
// 判断文档对象中存储的数据是不是json对象
bool QJsonDocument::isObject() const
    
// 文档对象中的数据转换为json对象
QJsonObject QJsonDocument::object() const;
// 文档对象中的数据转换为json数组
QJsonArray QJsonDocument::array() const;

3.示例

3.1 写操作

将如下的Json字符串写入到文件中:

  1. 创建一个QJsonOBject对象,将各个键值对设置进QJsonOBject对象中
  2. 将QJsonOBject对象转换为QJsonDocument对象
  3. QJsonDocument对象在转换为QByteArry对象中。
  4. 通过文件操作写入到文件中
/*
{
    "Name":"lisa",
     "Age":20,

    //Family中的value值是一个Json对象
    "Family":{
        "Father":"Gol·D·Roger",
        "Mother":"Portgas·D·Rouge",
        "Brother":["Sabo", "Monkey D. Luffy"]
    },
    "IsAlive":false,
    "Comment":"yyds"
}
*/


void qjson_write()
{
    QJsonObject value;
    value.insert("Name","lisa");
    value.insert("age",20);

    /*
      封装:
      "Family":{
        "Father":"Gol·D·Roger",
        "Mother":"Portgas·D·Rouge",
        "Brother":["Sabo", "Monkey D. Luffy"]
       }
   */
    QJsonObject family_value;
    family_value.insert("Father","Gol·D·Roger");
    family_value.insert("Mother","Portgas·D·Rouge");
    QJsonArray bro_arry;
    bro_arry.push_back(QJsonValue("Sabo"));
    bro_arry.push_back(QJsonValue("Monkey D. Luffy"));
    family_value.insert("Brother",bro_arry);

    value.insert("Family",family_value);
    value.insert("IsAlive",false);
    value.insert("Comment","yyds");

    QJsonDocument document(value);
    QByteArray s=document.toJson();

    QFile file("E:\\test1.json");

    file.open(QFile::WriteOnly);
    file.write(s);
    file.close();
}

输出:

toBinaryData()函数转化的效果;

 toJson()函数转换的效果:

3.2 读操作

  • 将上面的文件给读取到QJsonDocument,并转换为QJsonObject.
  • 将其中键值为 age,Name 和 Comment的进行打印。
void qjson_read()
{
    //打开文件,并读取Json字符串
    QFile file("E:\\test1.json");
    file.open(QFile::ReadOnly);
    QByteArray s=file.readAll();
    file.close();

    //将Json字符串转换为QJsonDocument对象
    QJsonDocument document=QJsonDocument::fromJson(s);

    QJsonObject object;
    if(document.isObject()){
         object=document.object();
    }

    //获取所有的key值
    QStringList keys=object.keys();
   // qDebug()<<object.size();
   //遍历QJsonObject中所有的键值对
    for(int i=0;i<object.size();i++)
    {
        QString key=keys.at(i);
        QJsonValue value=object[key];

        if(value.isDouble())
        {
            int v=value.toInt();
            qDebug()<<key<<v;
        }
        else if(value.isString())
        {
            QString s=value.toString();
            qDebug()<<key<<s;
        }
    }

}

输出: 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Host is not allowed to connect to this MySQL server

问题:win10 系统上运行node&#xff0c;运行提示&#xff1a;Host is not allowed to connect to this MySQL server。 在windows10上面装完MySQL8.0.28&#xff0c;发现本地可以使用Navicat进行连接 &#xff0c;但是在vue项目中调用node接口连接mysql却报错Host is not all…

Python学习笔记(十五)————文件操作相关

目录 1&#xff09;文件编码 2&#xff09; 文件的读取 ①open()打开函数 ② mode常用的三种基础访问模式 ③读操作相关方法 read()方法&#xff1a; readlines()方法&#xff1a; readline()方法&#xff1a;一次读取一行内容 for循环读取文件行 close() 关闭文件对象 wi…

simulink 结构体 bus creator

目录 结构体创建 bus creator 结构体引用Bus Selector 结构体赋值Bus Assignment 结构体对象 Bus 结构体数组打包Vector Concatenate 结构体数据存文件 结构体创建 bus creator 结构体引用Bus Selector 结构体赋值Bus Assignment 结构体对象 Bus 结构体数组打包Vector Co…

【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】

分析慢SQL的步骤 慢查询的开启并捕获&#xff1a;开启慢查询日志&#xff0c;设置阈值&#xff0c;比如超过5秒钟的就是慢SQL&#xff0c;至少跑1天&#xff0c;看看生产的慢SQL情况&#xff0c;并将它抓取出来explain 慢SQL分析show Profile。&#xff08;比explain还要详细…

手搭手入门Spring boot+Mybatis+达梦数据库(国产数据库)

环境介绍 软件版本DM数据库dm8_20230418_x86_win_64IDEAIntelliJ IDEA 2022.2.1JDK1.8Spring Boot2.7.13mybatis2.3.1 达梦&#xff08;国产数据库&#xff09;可以将数据库名和表名自动转换为大写(注意&#xff01;&#xff01;创建达梦数据库实例的时候配置是否有勾选大小写…

Android Glide自定义AppGlideModule,让Glide在app启动后基于定制化GlideModule加载,kotlin

Android Glide自定义AppGlideModule&#xff0c;让Glide在app启动后基于定制化GlideModule加载&#xff0c;kotlin project的build.gradle: buildscript {repositories {maven {url uri("https://plugins.gradle.org/m2/")}}dependencies {classpath("org.jet…

Maven高级(二)--继承与版本锁定

一.继承 1.目的&#xff1a;不同模块中经常需要用到同一个依赖&#xff0c;这样要在每个pom.xml中都引入对应的坐标&#xff0c;继承可以用来解决依赖引入重复的问题。 2.实现&#xff1a;我们可以在创建一个父工程&#xff0c;然后将多个模块来继承这个父工程。然后再将各个模…

功能需求-前端在合同页面显示图片印章

需求描述 需要在项目中的合同页面的指定位置显示一个配置好的图片印章&#xff0c;实现好的效果&#xff0c;如下&#xff1a; 实现方案 使用使用CSS的绝对定位position来实现&#xff0c;代码如下&#xff1a; <div id"FatherBuyer"><img :src"s…

SpringAOP切面是否可以改变被代理方法的返回类型?

SpringAOP切面能不能改变被代理方法的返回类型&#xff1f; 注意&#xff0c;这里的AOP使用的aspectjweaver <!--AOP核心依赖aspectjweaver--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId></de…

【C++】 Qt-线程进程

文章目录 进程&#xff08;process&#xff09;线程&#xff08;Thread&#xff09;创建线程 进程&#xff08;process&#xff09; 在任务管理器中能看到进程Tab页下&#xff0c;将所有进程分为三类&#xff1a; 应用&#xff1a;打开的正在运行的软件。后台进程&#xff1a…

STM32寄存器点亮LED灯

一&#xff1a; 如何寄存器点灯 1&#xff1a;看单片机的原理图 找到LED灯 这个灯是 PB5引脚 看原理图可以看出 让GPIOB5输出低电平 就能点亮那么我们得让打开控制GPIOB5的时钟让GPIOB5 输出模式让GPIOB5低电平 二&#xff1a;看中文参考手册配置寄存器 2.1&#xff1a;打开管…

python与深度学习——基础环境搭建

一、安装jupyter notebook Jupyter Notebook是一个开源的交互式笔记本环境&#xff0c;可以用于编写和执行代码、创建可视化效果、展示数据分析结果等。我们在这里用它实现代码运行和观察运行结果。安装jupyter notebook实质上是安装Anaconda,后续还要在Anaconda Prompt中使用c…

AI视频智慧安监平台EasyCVR每次重启服务短时间播放后又无法播放,是什么原因?

EasyCVR视频融合平台基于云边端智能协同架构&#xff0c;具有强大的设备接入、视频汇聚管理、全网分发、按需调阅、鉴权播放、智能分析等视频能力与服务。平台开放度高、兼容性强、可支持灵活拓展与第三方集成。 有用户反馈&#xff0c;EasyCVR每次重启服务后&#xff0c;可以短…

操作系统11:虚拟存储器

目录 1、虚拟存储器概述 &#xff08;1&#xff09;常规存储管理方式的特征和局部性原理 1.1 - 常规存储器管理方式的特征 1.2 - 局部性原理 1.3 - 虚拟存储器的基本工作情况 &#xff08;2&#xff09;虚拟存储器的定义和特征 2.1 - 虚拟存储器的定义 2.2 - 虚拟存储器…

【缓存中间件】Redis哈希槽的概念

数据分布理论 分布式数据库首先要解决把整个数据集按照分区规则映射到多个节点的问题&#xff0c;即把数据集划分到多个节点上&#xff0c;每个节点负责整体数据的一个子集。。 需要重点关注的是数据分区规则。常见的分区规则有哈希分区和顺序分区两种&#xff0c;哈希分区离散…

项目集成支付宝报错:调试错误,请回到请求来源地,重新发起请求。 错误代码invalid-app-id错误原因:无效的ApplD参数

问题 项目集成支付宝报错&#xff1a;调试错误&#xff0c;请回到请求来源地&#xff0c;重新发起请求。 错误代码invalid-app-id错误原因:无效的ApplD参数 详细问题 笔者按照支付宝沙箱支付快速集成版进行操作&#xff0c;操作完成访问所集成的支付宝&#xff0c;页面如下 …

微信小程序做登录密码显示隐藏效果

wxml 注意&#xff1a;在html中的input是通过切换type的属性值来实现隐藏显示的 在微信小程序的input里面type没有password属性 是通过password属性的true或者false来设置是否为密码框 <view class"input-item"><text class"tit">密码</…

怎么学习PHP表单处理与验证? - 易智编译EaseEditing

要学习PHP表单处理与验证&#xff0c;可以按照以下步骤进行&#xff1a; 掌握PHP基础知识&#xff1a; 在学习PHP表单处理与验证之前&#xff0c;首先需要对PHP编程语言有基本的了解。学习PHP的语法、变量、数据类型、数组、函数等基础知识是必要的。 学习HTML表单&#xff1…

如何确定活动隔断整体色调

确定活动的整体色调可以通过以下几个步骤&#xff1a; 1. 确定主题或目标&#xff1a;首先要明确活动的主题或目标&#xff0c;这将有助于确定活动需要传达的情感或氛围。 2. 考虑活动类型&#xff1a;根据活动的类型&#xff0c;例如婚礼、生日派对、企业活动等&#xff0c;可…

【代码随想录day4】两两交换链表中的节点

题目 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2,1,4,3] 示例 2&#xff1a; …