当前位置: 首页 > news >正文

qt中json类

目录

QJsonValue

 QJsonObject

 QJsonArray

QJsonDocument

案例:


Qt 5.0开始提供了对Json的支持,我们可以直接使用Qt提供的Json类进行数据的组织和解析,下面介绍4个常用的类。

QJsonValue

该类封装了JSON支持的数据类型。

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

值的类型可以使用 type() 或 isBool()、isString() 等访问器进行查询。同样,可以使用 toBool()、toString() 等将值转换为存储在其中的类型。 

 

 QJsonObject

JSON 对象是键值对的列表,其中键是唯一字符串,值由 QJsonValue 表示。

API的使用类似于c++的STL库,支持插入,删除,查找等,也有迭代器。例如:

QJsonValue QJsonObject::value(QLatin1String key) const;        // 字符串不支持中文

QJsonValue QJsonObject::take(const QString &key);    // 返回key对应的value值

QStringList QJsonObject::keys() const;//先得到对象中所有的键值, 在遍历键值列表, 通过key得到value值 

 QJsonArray

JSON 数组是一个值列表。可以通过在数组中插入和删除 QJsonValue 来操作该列表。

使用方法也类似与STL中vector等,有迭代器。例如:

构造函数:

QJsonDocument

它封装了一个完整的JSON文档,并且可以从UTF-8编码的基于文本的表示以及Qt自己的二进制格式读取和写入该文档。QJsonObject 和 QJsonArray这两个对象中的数据是不能直接转换为字符串类型的,如果要进行数据传输或者数据的持久化,,我们需要通过一个Json文档类进行二者之间的转换。

构造函数:

 将文件对象中的数据进行序列化

// 二进制格式的json字符串
QByteArray QJsonDocument::toBinaryData() const;     
// 文本格式
QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const;    

字符串 ===> QJsonObject 或者 QJsonArray

1.将得到的Json格式字符串通过 QJsonDocument 类的静态函数转换为QJsonDocument类对象

[static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
// 参数文件格式的json字符串
[static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);

2.将文档对象转换为json数组/对象

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

3.通过调用QJsonArray , QJsonObject 类提供的 API 读出存储在对象中的数据

案例:

void MainWindow::write()
{QJsonObject obj;//存储的是键值对,key值是字符串,value是QJsonValue支持的类型,也可以是 QJsonArray,QJsonObject,嵌套使用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");QJsonArray array;//JSON 数组是一个值列表。可以通过在数组中插入和删除 QJsonValue 来操作该列表array.append("Sabo");array.append("Monkey D. Luffy");subObj.insert("Brother", array);obj.insert("Family", subObj);obj.insert("IsAlive", false);obj.insert("Comment", "yyds");QJsonDocument doc(obj);QByteArray json = doc.toJson();QFile file("d:\\ace.json");file.open(QFile::WriteOnly);file.write(json);file.close();}void MainWindow::read()
{QFile file("d:\\ace.json");file.open(QFile::ReadOnly);QByteArray json = file.readAll();file.close();QJsonDocument doc = QJsonDocument::fromJson(json);if(doc.isObject())//该数据是 QJsonObject数据{QJsonObject obj = doc.object();QStringList keys = obj.keys();//获取对应的key值for(int i=0; i<keys.size(); ++i){QString key = keys.at(i);QJsonValue value = obj.value(key);//通过key值查找value值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 << ":";again(value);}}}}void MainWindow::again( QJsonValue doc)
{if(doc.isObject())//该数据是 QJsonObject数据{QJsonObject subObj = doc.toObject();QStringList keys =subObj.keys();//获取对应的key值for(int i=0; i<keys.size(); ++i){QString key = keys.at(i);QJsonValue value = subObj.value(key);//通过key值查找value值if(value.isBool()){qDebug() << key << ":" << value.toBool();}if(value.isString()){qDebug() << key << ":" << value.toString();}if(value.isDouble()){qDebug() << key << ":" << value.toInt();}if(value.isArray()){qDebug()<< key << ":";QJsonArray array = value.toArray();for(int i=0;i<array.size();i++){qDebug()<<array[i].toString();//以提前知道数组存储的是字符串,不然还要再判断}}if(value.isObject())//继续嵌套{qDebug()<< key << ":";again(value);}}}

相关文章:

qt中json类

目录 QJsonValue QJsonObject QJsonArray QJsonDocument 案例&#xff1a; Qt 5.0开始提供了对Json的支持&#xff0c;我们可以直接使用Qt提供的Json类进行数据的组织和解析&#xff0c;下面介绍4个常用的类。 QJsonValue 该类封装了JSON支持的数据类型。 布尔类型&#xf…...

NeurIPS 2023 | AD-PT:首个大规模点云自动驾驶预训练方案

概要 自动驾驶领域的一个长期愿景是&#xff0c;感知模型能够从大规模点云数据集中学习获得统一的表征&#xff0c;从而在不同任务或基准数据集中取得令人满意的结果。之前自监督预训练的工作遵循的范式是&#xff0c;在同一基准数据集上进行预训练和微调&#xff0c;这很难实…...

设计模式-结构型模式

文章目录 一、代理模式1.静态代理2.JDK动态代理3.CGLib动态代理4.三种代理对比 二、适配器模式1.类适配器模式2.对象适配器模式 三、装饰者模式静态代理和装饰者的区别 四、桥接模式五、外观模式六、组合模式七、享元模式 结构性模式描述如何将类或对象按某种布局组成更大的结构…...

BUUCTF学习(7): 随便注,固网杯

1、介绍 2、解题 11;show tables;# select * from 1919810931114514 concat(sel,ect from 1919810931114514 ) PEREPARE y from sql; ECCUTE y; -1; sEt sql CONCAt(se,lect * from 1919810931114514;)&#xff1b; prePare stmt from sql; EXECUTE stmt; # 结束...

【文末福利】巧用Chat GPT快速提升职场能力:数据分析与新媒体运营

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…...

院内导航系统厂商分析

随着医疗技术的不断发展和医院规模的不断扩大&#xff0c;院内导航系统成为了现代化医院不可或缺的一部分。患者就医时&#xff0c;一个高效便捷的导航系统可以帮助他们快速找到目标科室&#xff0c;同时也能提高医院的整体运营效率。本文将推荐五家在院内导航市场具有竞争力的…...

MES系统作业调度

一、MES系统作业调度的概念和功能 作业调度是指在制造过程中&#xff0c;根据生产计划和实际情况&#xff0c;合理安排和调度各项任务和资源&#xff0c;以达到最佳的生产效率和资源利用率。MES系统作业调度功能涉及以下方面&#xff1a; 1. 任务计划与分配&#xff1a;MES系…...

C++入门-引用

C入门-引用 前置知识点:函数栈帧的复用前置知识点:类型转换时产生的临时变量1.含义2.代码形式3.引用的价值1.传参数传参效率测试补充:C与Java中引用的区别 2.引用做返回值(前置知识:栈帧复用)1.传值返回2.传引用返回传引用返回并用引用接收3.静态变量传引用返回4.引用做返回值真…...

问题:Qt中软件移植到笔记本中界面出现塌缩

这是由于软件之前运行的设备DPI较低&#xff0c;移植到笔记本中显示设备DPI较高&#xff0c;导致窗体显示进行了缩放。 解决方案&#xff0c;在main.cpp中加入以下代码&#xff1a; if(QT_VERSION>QT_VERSION_CHECK(5,6,0)) QCoreApplication::setAttribute(Qt::AA_EnableHi…...

NDK编译脚本:Android.mk or CMakeLists.txt

本文来自于&#xff1a;https://github.com/xufuji456/FFmpegAndroid/blob/master/doc/NDK_compile_shell.md 前言 Android NDK以前默认使用Android.mk与Application.mk进行构建&#xff0c;但是在Android Studio2.2之后推荐使用CMake进行编译。 CMake是跨平台编译工具&#…...

低代码提速应用开发

低代码介绍 低代码平台是指一种能够帮助企业快速交付业务应用的平台。自2000年以来&#xff0c;低代码市场一直充斥着40大大小小的各种玩家&#xff0c;比如国外的Appian、K2、Pega Systems、Salesforce和Ultimus&#xff0c;国内的H3 BPM。 2015年以后&#xff0c;这个市场更是…...

Hi3516DV500 SVP_NNN添加opencv库记录

默认没有带opencv库&#xff0c;但是实际项目中需要用到opencv库&#xff0c;因此添加一下此库&#xff1b; 1&#xff1a;编译opencv源码&#xff0c;这里具体可以参考 海思Hi3516移植opencv以及错误调试_海思hi3516摄像头开发-CSDN博客 2&#xff1a;在工程的根目录下新建…...

BIO实战、NIO编程与直接内存、零拷贝深入剖析

原生 JDK 网络编程 BIO BIO&#xff0c;意为 Blocking I/O&#xff0c;即阻塞的 I/O。   BIO 基本上就是我们上面所说的生活场景的朴素实现。在 BIO 中类 ServerSocket 负责绑定 IP 地址&#xff0c;启动监听端口&#xff0c;等待客户连接&#xff1b;客户端 Socket 类的实例…...

计网第六章(应用层)(四)(电子邮件)

电子邮件采用客户/服务器的方式。 1、三个构成 电子邮件系统的三个组成构件&#xff1a;用户代理、邮件服务器以及电子邮件所需的协议。 用户代理是用户与电子邮件系统的接口&#xff0c;又称为电子邮件客户端软件。 邮件服务器是电子邮件系统的基础设施。因特网上所有的服…...

Lua篇笔记

. 和 : 的区别 lua的面向对象 Lua数据类型 nil number bool table string userdata thread function Lua-字符串连接 C#与Lua交互过程及原理 Lua中的闭包 常见的一些Lua功能 热重载&#xff1a; function reload_module(module_name) local old_module _G[module_name] --取…...

一种更具破坏力的DDoS放大攻击新模式

近日&#xff0c;内容分发网络&#xff08;CDN&#xff09;运营商Akamai表示&#xff0c;一种使网站快速瘫痪的DDoS放大攻击新方法正在被不法分子所利用。这种方法是通过控制数量巨大的中间设备&#xff08;middlebox&#xff0c;主要是指配置不当的服务器&#xff09;&#xf…...

WordPress 常规设置页面调用媒体中心上传图片插入URL(新版可用)

首先&#xff0c;我们需要在主题或插件文件夹中创建一个 JavaScript 文件&#xff08;如&#xff1a;media-uploader.js&#xff09;&#xff0c;该文件中包含如下代码。 /*** 媒体中心上传 js **/ jQuery(document).ready(function($){var mediaUploader;$(#upload_image_but…...

Elasticsearch实现检索词自动补全(检索词补全,自动纠错,拼音补全,繁简转换) 包含demo

Elasticsearch实现检索词自动补全 自动补全定义映射字段建立索引测试自动补全 自动纠错查询语句查询结果 拼音补全与繁简转换安装 elasticsearch-analysis-pinyin 插件定义索引与映射建立拼音自动补全索引测试拼音自动补全测试繁简转换自动补全 代码实现demo结构demo获取 自动补…...

LaunchView/启动页 的实现

1. 创建启动画板&#xff0c;LaunchScreen.storyboard 添加组件如图: 2. 项目中设置只支持竖屏&#xff0c;添加启动画板&#xff0c;如图: 3. 创建启动画面动画视图&#xff0c;LaunchView.swift import SwiftUI/// 启动视图 struct LaunchView: View {/// 字符串转换为字符串…...

windows安装npm教程

在安装和使用NPM之前&#xff0c;我们需要先了解一下&#xff0c;NPM 是什么&#xff0c;能干啥&#xff1f; 一、NPM介绍 NPM&#xff08;Node Package Manager&#xff09;是一个用于管理和共享JavaScript代码包的工具。它是Node.js生态系统的一部分&#xff0c;广泛用于构…...

PCB布局设计规范与最佳实践指南

PCB布局设计的最佳实践指南1. 布局设计基础原则1.1 结构约束优先处理在PCB布局初期&#xff0c;必须优先考虑机械结构约束条件&#xff1a;根据导入的结构文件定位所有有特殊位置要求的器件连接器1脚位置必须与结构设计完全匹配严格遵守产品设计中规定的元件限高要求1.2 美观与…...

从零开始:用QGIS和PostgreSQL构建交通路线空间数据库(含Python脚本自动化技巧)

从零开始&#xff1a;用QGIS和PostgreSQL构建交通路线空间数据库&#xff08;含Python脚本自动化技巧&#xff09; 在交通规划与智慧城市建设的浪潮中&#xff0c;空间数据的高效管理成为技术团队的核心挑战。传统文件存储方式难以应对大规模交通网络数据的实时查询与分析需求&…...

防火墙旁挂模式实战:用华为模拟器ENSP搭建VRF+OSPF实验环境(保姆级)

华为eNSP防火墙旁挂模式全实战&#xff1a;从VRF设计到流量抓包分析 在企业网络架构中&#xff0c;防火墙的部署方式直接影响网络安全策略的实施效果。旁挂模式作为一种灵活部署方案&#xff0c;既能实现流量精细化管控&#xff0c;又避免了单点故障风险。本文将带您使用华为eN…...

Spring Boot实战:5分钟搞定CORS跨域配置(含@CrossOrigin详解)

Spring Boot实战&#xff1a;5分钟搞定CORS跨域配置&#xff08;含CrossOrigin详解&#xff09; 现代Web开发中&#xff0c;前后端分离架构已成为主流选择。这种架构下&#xff0c;前端应用运行在一个域名下&#xff0c;而后端API服务则部署在另一个域名。当浏览器尝试从前端向…...

ai辅助开发comfyui:让快马ai成为你构建复杂工作流的智能编程伙伴

最近在折腾ComfyUI时&#xff0c;发现构建复杂工作流特别容易卡在细节问题上。比如想同时用Canny边缘检测和Openpose控制生成效果&#xff0c;光是调试节点连接和参数就花了大半天。后来尝试用InsCode(快马)平台的AI辅助功能&#xff0c;发现能省下不少重复劳动。这里分享下用A…...

路侧3D检测翻车实录:Rope3D数据集标签里的航向角坑,我是怎么填上的

路侧3D检测实战&#xff1a;Rope3D数据集航向角问题的深度解析与修复方案 当你在深夜盯着屏幕上那些"反向行驶"的虚拟车辆时&#xff0c;那种荒诞感会让人瞬间清醒。这不是科幻场景&#xff0c;而是我在使用Rope3D数据集进行路侧3D目标检测时遇到的真实困境——车辆航…...

【手把手】FFmpeg音视频开发从入门到实战:一文吃透音视频同步原理与代码实现(附完整源码)

文章目录第一章 基础必懂&#xff1a;音视频开发的核心概念与FFmpeg框架1.1 别再被封装格式忽悠&#xff1a;MP4、MKV、AVI到底差在哪&#xff1f;1.2 搞懂解码流程&#xff1a;FFmpeg处理音视频的4个核心结构体第二章 深入原理&#xff1a;音视频同步的核心机制2.1 播放器卡顿…...

各向异性方解石晶体的双折射效应

1. 摘要 双折射效应是各向异性材料最重要的光学特性&#xff0c;并广泛应用于多种光学器件。当入射光波撞击各向异性材料&#xff0c;会以不同的偏振态分束到不同路径&#xff0c;即众所周知的寻常光束和异常光束。在本示例中&#xff0c;描述了如何利用VirtualLab Fusion对双折…...

ES启动失败:深入解析No buffer space available错误及连接数优化策略

1. 当ES启动失败时发生了什么 第一次看到"No buffer space available"这个报错时&#xff0c;我也是一头雾水。那天凌晨三点&#xff0c;线上监控突然报警&#xff0c;ES集群集体罢工&#xff0c;整个搜索服务直接瘫痪。查看日志发现满屏都是"java.net.SocketE…...

PingFangSC 字体技术深度解析:现代Web字体架构实践指南

PingFangSC 字体技术深度解析&#xff1a;现代Web字体架构实践指南 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件&#xff0c;包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC PingFangSC&#xff08;苹方-简&#…...