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

QT笔记---JSON

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;
            }
        }
    }
}

相关文章:

  • 高并发库存系统是否适合使用 ORM(Hibernate / MyBatis)
  • kafka压缩
  • 从0到1在windows上用flutter开发android app(环境准备、创建项目、加速构建)
  • Linux环境变量:深入解析与实用指南
  • 软件上线倒计时,测试团队如何量化风险优先级?
  • 本地基于Ollama部署的DeepSeek详细接口文档说明
  • 【dify】 dify环境变量配置说明
  • AI智能问答“胡说八道“-RAG探索之路
  • 微信小程序使用状态管理 - mobx-miniprogram
  • 打破同源策略:前端跨域的全面解析与应对策略
  • MIPI 详解:XAPP894 D-PHY Solutions
  • 深入理解Java的 JIT(即时编译器)
  • 操作系统(第三章 内存管理)
  • 计算机三级网络技术知识汇总【10】
  • AtCoderABC387题解
  • Java复习
  • 透析Vue的nextTick原理
  • tryhackme——Password Attacks
  • 考研c语言复习之栈
  • CMS网站模板定制设计与安全评估
  • 越怕出错越会出错,“墨菲定律”的魔咒该怎么破?
  • 溢价26.3%!保利置业42.4亿元竞得上海杨浦宅地,楼板价80199元/平方米
  • 康子兴评《文明的追求》|野人脚印:鲁滨逊的恐惧与文明焦虑
  • 明明睡够了,怎么还有黑眼圈?可能是身体在求救
  • 早期投资人蜂巧资本清仓泡泡玛特套现超22亿港元,称基金即将到期
  • 两部门部署中小学幼儿园教师招聘工作:吸纳更多高校毕业生从教