QT笔记---JSON

news2025/3/22 7:33:58

QT笔记---JSON

  • JSON
    • 1、JSON基本概念
      • 1.1、判断.json文件工具
    • 2、生成.json数据
    • 3、解析.json数据

JSON

在现代软件开发中,数据的交换和存储格式至关重要。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁易读、易于解析和生成的特点,被广泛应用于各种应用程序中。在 QT 框架下,处理 JSON 数据同样便捷高效。
    本文参考链接:https://blog.csdn.net/qq_42432673/article/details/132115700

1、JSON基本概念

        JSON 数据结构主要由两种类型构成:对象(object)和数组(array)。对象是由键值对组成的无序集合,键必须是字符串,值可以是字符串、数字、布尔值、null、对象或数组。数组则是值的有序集合,这些值同样可以是上述各种类型。例如:

{
    "address": {
        "city": "WuHan",
        "street": "luck"
    },
    "age": "31",
    "hobbies": [
        "reading",
        "painting",
        "playing guitar"
    ],
    "isStudent": "true",
    "name": "John Doe",
    "phoneNumbers": [
        {
            "number": "888-1234",
            "type": "home"
        },
        {
            "number": "888-5678",
            "type": "work"
        }
    ]
}

1.1、判断.json文件工具

    JSON转C#实体类网站,可判断JSON文件是否正确:https://www.bejson.com/convert/json2csharp/

2、生成.json数据

    根据以上json内存,创建一个文件夹,将其写入.json文件夹,保存在项目下,运行代码如下所示:

//包含的头文件
#include <QMainWindow>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QString>
#include <QFile>

//创建一个json文件,写入参数,并保存在对应的路径下
void MainWindow::WriteToFile()
{
    QString m_path = QString::fromStdString(QCoreApplication::applicationDirPath().toStdString()+"//cfg.json");
    createJsonFile(m_path);
}
void MainWindow::createJsonFile(const QString &filePath)
{
    //创建一个JSON对象
    QJsonObject jsonObj;
    //插入name 键值对到 jsonObj
    jsonObj["name"]="John Doe";
    //jsonObj.insert("name","John Doe");
    //插入age 键值对到 jsonObj
    jsonObj["age"]="31";
   //jsonObj.insert("age","31");

    //创建地址JSON对象,里面包含两个键值对
    QJsonObject addressObj;
    //插入city 键值到 “New York”
    addressObj.insert("city","WuHan");
    addressObj.insert("street","luck");
    jsonObj.insert("address",addressObj);

     //创建地址JSON对象,里面包含两个键值对
     QJsonArray phoneArray;
    //创建两个电话的JSON对象
     QJsonObject phoneHomeObj;
    phoneHomeObj.insert("type","home");
    phoneHomeObj.insert("number","888-1234");
     QJsonObject phoneWorkObj;
    phoneWorkObj.insert("type","work");
    phoneWorkObj.insert("number","888-5678");
    //将电话JSON数组中添加两个电话JSON对象
    phoneArray.append(phoneHomeObj);
    phoneArray.append(phoneWorkObj);
    //将电话JSON数组中添加两个电话JSON对象
    jsonObj.insert("phoneNumbers",phoneArray);
    
    //创建地址JSON对象,里面包含了三组数组
    QJsonArray hobbArray;
    hobbArray.append("reading");
    hobbArray.append("painting");
    hobbArray.append("playing guitar");
    jsonObj.insert("hobbies",hobbArray);
    
    jsonObj["isStudent"]="true";

    //创建一个JSON文档
    QJsonDocument jsonDoc(jsonObj);

    //将JSON文档内容写入文件
    QFile file(filePath);
    if(!file.open(QIODevice::WriteOnly))
    {
        //处理错误,例如可以抛出异常或者返回错误的标志
        return;
    }
    file.write(jsonDoc.toJson());
    file.close();
}

3、解析.json数据

     创建一个cfg.json文件,将其内容粘贴负责其内;

{
	"name": "小王",
	"age": 30,
    "address": {
        "city": "北京",
        "street": "人民路32号"
    },
    "phoneNumbers": [
        {
            "number": "999-123456",
            "type": "家"
        },
        {
            "number": "999-654321",
            "type": "公司"
        }
    ]
}

使用QT解析以上json内容:

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

QByteArray MainWindow::ReadJsonString(QString file_path)
{
    QFile file(file_path);  //根据路径打卡文件
    if (false == file.exists())  //判断文件是否存在
    {
        return "none";
    }
    if (false == file.open(QIODevice::ReadOnly | QIODevice::Text)) //判断文件是否可以正常以只读模式打开
    {
        return "none";
    }
    QByteArray  string_value = file.readAll();  //读出.json所以内容
    file.close();
    return string_value;
}

void MainWindow::AnalyJson()
{
//json文件所在路径,可根据自己随意定制
    QString path= QString::fromStdString(QCoreApplication::applicationDirPath().toStdString()+"//cfg.json");
    QByteArray  reg_fpga = ReadJsonString(path);
    
    // 字符串格式化为JSON文档
    QJsonParseError err_rpt;
    QJsonDocument reg_fpga_root = QJsonDocument::fromJson(reg_fpga, &err_rpt);
    if (err_rpt.error != QJsonParseError::NoError)
    {
        // 不是 JSON 对象:JSON 字符串格式错误或无效
        std::cout << "json 格式错误" << std::endl;
        //	return 0;
    }
    
    //将 QJsonDocument 对象中的 JSON 数据转换为 JSON 对象
    QJsonObject reg_object = reg_fpga_root.object();
    
    // 获取 JSON 数据中的所有键
    QStringList keys = reg_object.keys();
    
    // 遍历键值对
    for (int i = 0;i<keys.size();++i) 
    {
        // 获取每一个 key
        QString key = keys[i];
        // 通过 key 获取对应的 value
        QJsonValue value = obj.value(key);
        if(value.isBool())
        {// 值是一个 bool
            qDebug()<<key<<":"<<value.toBool();
        }
        else if(value.isString())
        {// 值是一个字符串
            qDebug()<<key<<":"<<value.toString();
        }
        else if(value.isDouble())
        {// 值是一个 double 或者 int(double 和 int 都用 isDouble)
            qDebug()<<key<<":"<<value.toInt();
        }
        else if(value.isObject())
        {// 值是一个 JSON 对象
            qDebug()<<key<<":";
            // 这里偷个懒,不再像上面那样循环获取值了,而是直接通过已知的键去获取值
            QJsonObject addressObj = value.toObject();
            QString city = addressObj["city"].toString();
            QString street = addressObj["street"].toString();
            qDebug()<<"  "<<"city:"<<city;
            qDebug()<<"  "<<"street:"<<street;
        }
        else if (value.isArray())
        {// 值是一个 JSON 数组
            qDebug()<<key<<":";
            QJsonArray phoneArray = value.toArray();
            for (int i = 0;i<phoneArray.size();++i) 
            {// 遍历 JSON 数组中的每一个 JSON 对象
                QJsonObject phoneObj = phoneArray[i].toObject();
                QString number = phoneObj["number"].toString();
                QString type = phoneObj["type"].toString();
                qDebug()<<"  "<<"number:"<<number;
                qDebug()<<"  "<<"type:"<<type;
            }
        }
    }
}

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

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

相关文章

C++ string的模拟实现

Hello!!大家早上中午晚上好&#xff0c;昨天复习了string的使用&#xff0c;今天来模拟实现一下string&#xff01;&#xff01;&#xff01; 一、string的框架搭建 1.1首先我们需要一个string的头文件用来做变量、函数、类等声明&#xff1b;再需要一个test文件来做测试,还需…

使用LangChain实现基于LLM和RAG的PDF问答系统

目录 前言一.大语言模型(LLM)1. 什么是LLM&#xff1f;2. LLM 的能力与特点 二、增强检索生成(RAG)三. 什么是 LangChain&#xff1f;1. LangChain 的核心功能2. LangChain 的优势3. LangChain 的应用场景4. 总结 四.使用 LangChain 实现基于 PDF 的问答系统 前言 本文将介绍 …

C++实现rabbitmq生产者消费者

RabbitMQ是一个开源的消息队列系统&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c; 特点 可靠性&#xff1a;通过持久化、镜像队列等机制保证消息不丢失&#xff0c;确保消息可靠传递。灵活的路由&#xff1a;提供多种路由方式&#xff0c;如…

在VMware上部署【Ubuntu】

镜像下载 国内各镜像站点均可下载Ubuntu镜像&#xff0c;下面例举清华网站 清华镜像站点&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体下载步骤如下&#xff1a; 创建虚拟机 准备&#xff1a;在其他空间大的盘中创建存储虚拟机的目录&#xff0c…

又双叒叕Scrapy爬虫相关的面试题及详细解答

Scrapy是Python开发的一个快速、高层次的网络爬虫框架,专注于高效抓取网页并提取结构化数据。其核心设计基于异步处理机制,适合大规模数据采集任务。 文章目录 基础概念1. Scrapy框架的核心组件有哪些?架构与流程2. 描述Scrapy的工作流程核心组件详解3. 如何自定义Item Pipe…

使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)

1.STM32CubeMX配置 &#xff08;1&#xff09;配置SYS &#xff08;2&#xff09;配置RCC &#xff08;3&#xff09;配置串口&#xff0c;此处我用的是串口4&#xff0c;其他串口也是一样的 &#xff08;4&#xff09;配置DMA&#xff0c;将串口4的TX和RX添加到DMA中 &#…

【视觉提示学习】3.21论文随想

. . Frontiers of Information Technology & Electronic Engineering. 2024, 25(1): 42-63 https://doi.org/10.1631/FITEE.2300389 中文综述&#xff0c;根据里面的架构&#xff0c;把视觉提示学习分成两类&#xff0c;一类是单模态提示学习&#xff08;以vit为代表&…

(一)丶Windows安装RabbitMQ可能会遇到的问题

一丶可能会忘了配置ERLang的环境变量 二丶执行命令时报错 第一步 rabbitmq-plugins enable rabbitmq_management 第二部 rabbitmqctl status 三丶修改.erlang.cookie 文件 1.找到C盘目下的.erlang.cookie文件 C:\Users\admin\.erlang.cookie C:\Windows\System32\config\sys…

Mistral AI发布开源多模态模型Mistral Small 3.1:240亿参数实现超越GPT-4o Mini的性能

法国人工智能初创公司Mistral AI于2025年3月正式推出新一代开源模型Mistral Small 3.1 &#xff0c;该模型凭借240亿参数的轻量级设计&#xff0c;在多项基准测试中表现优异&#xff0c;甚至超越了Google的Gemma 3和OpenAI的GPT-4o Mini等主流专有模型。 1、核心特性与优势 多…

springboot整合mybatis-plus【详细版】

目录 一&#xff0c;简介 1. 什么是mybatis-plus2.mybatis-plus特点 二&#xff0c;搭建基本环境 1. 导入基本依赖&#xff1a;2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三&#xff0c;基本知识介绍 1. 基本注解 T…

Qt之MVC架构MVD

什么是MVC架构&#xff1a; MVC模式&#xff08;Model–view–controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controll…

深度解析学术论文成果评估(Artifact Evaluation):从历史到现状

深度解析学术论文成果评估(Artifact Evaluation)&#xff1a;从历史到现状 引言 在计算机科学和工程领域的学术研究中&#xff0c;可重复性和可验证性越来越受到重视。随着实验性研究的复杂性不断增加&#xff0c;确保研究成果可以被其他研究者验证和构建变得尤为重要。这一需…

二分查找上下界问题的思考

背景 最近在做力扣hot100中的二分查找题目时&#xff0c;发现很多题目都用到了二分查找的变种问题&#xff0c;即二分查找上下界问题&#xff0c;例如以下题目&#xff1a; 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 它们不同于查找…

关于FastAPI框架的面试题及答案解析

FastAPl是一个现代、快速(高性能)的Web框架,用于构建API,基于Python3.7+的类型提示功能。它由Python开发者SebastianRamirez创建,并且使用了Starlette作为其核心组件以及Pydantic进行数据验证。 文章目录 基础篇1. FastAPI的核心优势是什么?2. 如何定义一个GET请求路由?…

HashMap添加元素的流程图

文章目录 JDK7 vs JDK8 的 HashMap 结构变化Java8 中哈希表的红黑树优化机制HashMap 添加元素的完整流程解析1. 计算 key 的哈希值并确定索引2. 检查该索引位置是否已有元素3. 处理哈希冲突4. 判断当前存储结构&#xff08;链表还是红黑树&#xff09;5. 判断链表长度是否超过 …

面向医药仓储场景下的药品分拣控制策略方法 研究(大纲)

面向医药仓储场景下的药品分拣控制策略方法研究 基于多机器人协同与智能调度的分拣系统设计 第一章 绪论 1.1 研究背景与意义 医药仓储自动化需求&#xff1a; 人工分拣效率低、出错率高&#xff08;如药品批次混淆、过期风险&#xff09;温控药品&#xff08;如疫苗、生物制…

AI大模型介绍

大模型介绍 大模型是指具有大规模参数和复杂计算结构的机器学习模型&#xff0c;通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数 开发大模型不是从0开始&#xff0c;是建立在已有的大模型基座模型上做开发&#xff0c;构建企业知识库&#xff08;向量数据库…

OpenPCDet详细部署与复现

OpenPCDet简介 OpenPCDet是一个用于3D目标检测的开源工具箱&#xff0c;它提供了多种数据集的加载器&#xff0c;支持多种模型&#xff0c;并且易于扩展。 本人使用硬件与环境 Linux操作系统&#xff08;Ubuntu20.04&#xff09; Python环境&#xff08;Anaconda下独立创建&…

同旺科技USB to I2C 适配器 ---- 指令之间延时功能

所需设备&#xff1a; 内附链接 1、同旺科技USB to I2C 适配器 1、指令之间需要延时发送怎么办&#xff1f;循环过程需要延时怎么办&#xff1f;如何定时发送&#xff1f;现在这些都可以轻松解决&#xff1b; 2、只要在 “发送数据” 栏的Delay单元格里面输入相应的延迟时间就…

网络华为HCIA+HCIP NFV

目录 NFV关键技术&#xff1a;虚拟化 NFV关键技术&#xff1a;云化 NFV架构 NFV标准架构 ​编辑 NFV架构功能模块 NFV架构接口 NFV关键技术&#xff1a;虚拟化 在NFV的道路上&#xff0c;虚拟化是基础&#xff0c;云化是关键。传统电信网络中&#xff0c;各个网元都是…