Qt之Json操作demo

news2024/11/27 20:39:41

一、JSON简介:

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台。JSON解析器和JSON库支持许多不同的编程语言,被广泛用于Internet上的数据交换格式。

    JSON的语法主要是:
        1)键值对(key:value)
              键值key,必须是字符串,位于同一层级的键值,不能重复;
              value值,类型是可选的,整形,浮点型,字符串,json数组,json对象,空值-null(null)。
        2)元素和元素之间使用 , 间隔,最后一个元素后面没有 ,
        3)花括号保存对象,每个Json对象可以存储若干个元素
        4)方括号保存数组,数组内的元素类型可以不一致
        5)json文档始终以方括号或大括号开头

    官网:http://json.org/

二、QT中的JSON:

qt中的json类:

1)QJsonDocument:

提供读取和写入JSON文档的方法,可以通过成员函数array()和object()检索文档中包含的数组和对象,读取数据或修改数据。
使用上例如:
    QJsonObject obj;
    obj.insert(“name”,QString(“Test”));
    QJsonDocument doc(obj); //将Json对象,转换成Json文档
    //显示用
    QByteArray json = doc.toJson();
    ui.textEdit->setText(json);
    //写入文件
    QFile file(“…/my.json”);
    file.open(QFile::WriteOnly);
    file.write(json);
    file.close();

2)QJsonObject:

封装了Json中的对象,在里边可以存储多个键值对,为了方便操作,键值为字符串类型,值为QJsonValue类型。QJsonObject内数据使用insert插入,根据key值,自动排序,底层红黑树,升序。
使用上例如:
    QJsonObject obj;
    obj.insert(“name”,QString(“Test”));
    obj.insert(“sex”,QString(“Man”));

常用遍历方法:
    1)使用迭代器函数:QJsonObject::iterator
    2)使用 [] 的方式遍历,类似于遍历数组,[] 中是键值

常用方法:
    1)获取对象中键值对个数:int QJsonObject::count() const;
    2)通过 key 得到 value:QJsonValue QJsonObject::value(const QString &key) const;
    3)通过key进行查找:bool QJsonObject::contains(const QString &key) const;
    4)将键值对添加到空对象中:iterator QJsonObject::insert(const QString &key, const QJsonValue &value);

3)QJsonValue:

基本数据类型:
    1)bool
    2)double
    3)string
    4)array
    5)object
    6)null

常用函数:
    1)判断数据类型:

    // 是否是Json数组
    bool isArray() const;

    // 是否是Json对象
    bool isObject() const;

    // 是否是布尔类型
    bool isBool() const;

    // 是否是浮点类型(整形也是通过该函数判断)
    bool isDouble() const;

    // 是否是空值类型
    bool isNull() const;

    // 是否是字符串类型
    bool isString() const;

    // 是否是未定义类型(无法识别的类型)
    bool isUndefined() const;

    2)转换数据类型:
    // 转换为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;

4)QJsonArray:

封装了Json数组,里面存储多个元素,为了方便操作,所有元素类型统一为QJsonValue类型。
使用上例如:
    QJsonObject obj;
    obj.insert(“Name”,QString(“Test”));
    QJsonArray array;
    array.append(QString(“1”));
    array.append(QString(“2”));
    obj.insert(“Number”,array);

QT-Json与Jsoncpp对比:
    性能上的话,QT-Json会比Jsoncpp好,QT-Json严格按照ECMA-404 协议的解析范本,Jsoncpp比较随意。Qt-Json允许设置默认值,对于无法转换成功的,不抛异常,而Jsoncpp不允许设置默认值,对于无法转换成功的,会抛异常。QT-Json支持的Json文本最大不能超过128M,嵌套层不能超过1024层。在错误信息上,QT-Json不能定位到具体行列,Jsoncpp可以定位到行列。

三、json-demo:

1)界面

在这里插入图片描述

2)核心代码

ctjson.h

#ifndef CTJSON_H
#define CTJSON_H

#include <QObject>
#include "commondef.h"

class CtJson : public QObject
{
    Q_OBJECT
public:
    CtJson();
    ~CtJson();
    static CtJson& getInstance();

signals:
    void sig_returnJsonData(PERSION_T stPersion);
    void sig_showJsonData(QByteArray jsonData);

public slots:
    void on_writeToJsonFile(PERSION_T stPersion);
    void on_readFromJsonFile();

};

#endif // CTJSON_H

ctjson.cpp

#include "ctjson.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QFile>
#include <QMessageBox>

CtJson::CtJson()
{
}

CtJson::~CtJson()
{
}

CtJson &CtJson::getInstance()
{
    static CtJson s_obj;
    return s_obj;
}

void CtJson::on_writeToJsonFile(PERSION_T stPersion)
{
    QJsonObject jsonObj;
    {
        jsonObj.insert("Name", stPersion.sName);
        jsonObj.insert("Age", stPersion.nAge);
        jsonObj.insert("Sex", stPersion.Sex);
        jsonObj.insert("Height", stPersion.nHeight);
        jsonObj.insert("Weight", stPersion.nWeight);
    }

    QJsonObject familyObj;
    {
        familyObj.insert("Father", stPersion.family.sFather);
        familyObj.insert("Mother", stPersion.family.sMother);
        QJsonArray BrotherArray;
        BrotherArray.append(stPersion.family.sBrother.at(0));
        BrotherArray.append(stPersion.family.sBrother.at(1));
        BrotherArray.append(stPersion.family.sBrother.at(2));
        familyObj.insert("Brothers", BrotherArray);
    }
    jsonObj.insert("Family", familyObj);

    QJsonDocument jDoc(jsonObj);
    QByteArray jsonData = jDoc.toJson();

    QFile file(JSON_FILE_PATH);
    if(!file.open(QIODevice::WriteOnly))
    {
        MY_DEBUG << "Open Json File Failed.";
        return;
    }
    file.write(jsonData);
    file.close();

    emit sig_showJsonData(jsonData);
}

void CtJson::on_readFromJsonFile()
{
    QFile file(JSON_FILE_PATH);
    if(!file.open(QIODevice::ReadOnly))
    {
        MY_DEBUG << "Open Json File Failed";
        return;
    }

    QByteArray fileData = file.readAll();
    file.close();

    QJsonParseError jError;
    QJsonDocument jDoc = QJsonDocument::fromJson(fileData, &jError);//转换成文档对象
    if(jError.error != QJsonParseError::NoError)
    {
        MY_DEBUG << "Json File Error.";
        return;
    }

    PERSION_T stPersion;
    if(jDoc.isObject())
    {
        QJsonObject jsonObj = jDoc.object();//得到Json对象
        stPersion.sName = jsonObj["Name"].toString();
        stPersion.nAge = jsonObj["Age"].toInt();
        stPersion.Sex = jsonObj["Sex"].toString();
        stPersion.nWeight = jsonObj["Weight"].toInt();
        stPersion.nHeight = jsonObj["Height"].toInt();

        QStringList keys = jsonObj.keys();//得到所有key
        for (int i = 0; i < keys.size(); i++)
        {
            QString key = keys.at(i);
            QJsonValue value = jsonObj.value(key);
            if(value.isObject())
            {
                QJsonObject subObj = value.toObject();
                QStringList subKeys = subObj.keys();
                for(int j = 0; j < subKeys.size(); ++j)
                {
                    QString subkey = subKeys.at(j);
                    QJsonValue subValue = subObj.value(subkey);
                    if(subValue.isString())
                    {
                        if(!subkey.compare("Father"))
                        {
                            stPersion.family.sFather = subValue.toString();
                        }
                        else if(!subkey.compare("Mother"))
                        {
                            stPersion.family.sMother = subValue.toString();
                        }
                    }
                    else if(subValue.isArray())
                    {
                        QJsonArray array = subValue.toArray();
                        for (int k = 0; k < array.size(); k++)
                        {
                            stPersion.family.sBrother.append(array[k].toString());
                        }
                    }
                }
            }

        }
    }
    emit sig_returnJsonData(stPersion);
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "commondef.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals:
    void sig_writeToJsonFile(PERSION_T stPersion);
    void sig_readFromJsonFile();

public slots:
    void on_returnJsonData(PERSION_T stPersion);
    void on_showJsonData(QByteArray jsonData);

private slots:
    void on_pushButton_Save_clicked();

    void on_pushButton_Read_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "ctjson.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    qRegisterMetaType<PERSION_T>("PERSION_T");

    connect(&CtJson::getInstance(), SIGNAL(sig_returnJsonData(PERSION_T)),
            this, SLOT(on_returnJsonData(PERSION_T)));
    connect(&CtJson::getInstance(), SIGNAL(sig_showJsonData(QByteArray)),
            this, SLOT(on_showJsonData(QByteArray)));
    connect(this, SIGNAL(sig_writeToJsonFile(PERSION_T)),
            &CtJson::getInstance(), SLOT(on_writeToJsonFile(PERSION_T)));
    connect(this, SIGNAL(sig_readFromJsonFile()),
            &CtJson::getInstance(), SLOT(on_readFromJsonFile()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_returnJsonData(PERSION_T stPersion)
{
    ui->lineEdit_Name->setText(stPersion.sName);
    ui->lineEdit_Age->setText(QString::number(stPersion.nAge));
    ui->lineEdit_Sex->setText(stPersion.Sex);
    ui->lineEdit_Height->setText(QString::number(stPersion.nHeight));
    ui->lineEdit_Weight->setText(QString::number(stPersion.nWeight));
    ui->lineEdit_Father->setText(stPersion.family.sFather);
    ui->lineEdit_Mother->setText(stPersion.family.sMother);
    ui->lineEdit_Brother1->setText(stPersion.family.sBrother.at(0));
    ui->lineEdit_Brother2->setText(stPersion.family.sBrother.at(1));
    ui->lineEdit_Brother3->setText(stPersion.family.sBrother.at(2));
}

void MainWindow::on_showJsonData(QByteArray jsonData)
{
    ui->textEdit_JsonShow->setText(jsonData);
}

void MainWindow::on_pushButton_Save_clicked()
{
    PERSION_T stPersion;
    stPersion.sName = ui->lineEdit_Name->text();
    stPersion.nAge = ui->lineEdit_Age->text().toInt();
    stPersion.Sex = ui->lineEdit_Sex->text();
    stPersion.nHeight = ui->lineEdit_Height->text().toInt();
    stPersion.nWeight = ui->lineEdit_Weight->text().toInt();
    stPersion.family.sFather = ui->lineEdit_Father->text();
    stPersion.family.sMother = ui->lineEdit_Mother->text();
    stPersion.family.sBrother.append(ui->lineEdit_Brother1->text());
    stPersion.family.sBrother.append(ui->lineEdit_Brother2->text());
    stPersion.family.sBrother.append(ui->lineEdit_Brother3->text());

    emit sig_writeToJsonFile(stPersion);
}

void MainWindow::on_pushButton_Read_clicked()
{
    emit sig_readFromJsonFile();
}

3)JSON文件

在这里插入图片描述

4)demo下载

下载地址:https://download.csdn.net/download/linyibin_123/87366418?spm=1001.2014.3001.5503

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

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

相关文章

多线程高级(线程状态、线程池、volatile、原子性、并发工具)

1.线程池 1.1 线程状态介绍 当线程被创建并启动以后&#xff0c;它既不是一启动就进入了执行状态&#xff0c;也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢&#xff1f;Java中的线程 状态被定义在了java.lang.Thread.State…

Java程序:jstack

前言 如果有一天&#xff0c;你的Java程序长时间停顿&#xff0c;也许是它病了&#xff0c;需要用jstack拍个片子分析分析&#xff0c;才能诊断具体什么病症&#xff0c;是死锁综合征&#xff0c;还是死循环等其他病症&#xff0c;本文我们一起来学习jstack命令~ jstack 的功能…

阳康后的第一篇博客,先来几道恶心二进制编程题

目录 一、统计二进制中1的个数 二、打印整数二进制的奇数位和偶数位 三、两个整数二进制位不同个数 一、统计二进制中1的个数 这是一道牛客网OJ题&#xff0c;感兴趣的话可以先做一遍再看解析哦 -> 牛客网的OJ链接 注意&#xff1a;上面的牛客网是接口型&#xff0c;不需…

Vagrant管理已存在的虚拟机

起因 某天打开VirtualBox后&#xff0c;发现之前创建的虚拟机都没了&#xff0c;后将虚拟机从本地磁盘又重新导入&#xff0c;但是发现使用 vagrant up 会创建新的虚拟机&#xff0c;而我要用vagrant管理已存在的虚拟机&#xff0c;就是 vagrant up的时候&#xff0c;我需要启动…

MySQL数据库:常用数据类型

一、整形和浮点型 数据类型大小说明对应C类型bit(n)n指定比特位数&#xff0c;默认1位比特位数&#xff0c;n范围1-64&#xff1b;存储数值范围2-2^n-1char[]tinyint1字节signed charsmallint2字节short intint4字节intbigint8字节long long intfloat(m,d)4字节单精度&#xf…

【前端】CSS基础

一、CSS基础 1.1CSS的介绍 CSS&#xff1a;层叠样式表&#xff08;Cascading style sheets&#xff09; CSS作用是什么&#xff1f;&#xff1f; 1.2CSS语法规则 写在哪里&#xff1f; CSS是style标签中&#xff0c;style标签一般写在head标签里面&#xff0c;title标签下…

真的强,又一个开源项目,杀疯了

最近&#xff0c;AI大模型连续火爆出圈&#xff0c;人工智能生成模型&#xff08;AIGC&#xff09;的热度尚未褪去&#xff0c;聊天机器人ChatGPT便引发全网热议&#xff0c;两周吸引百万用户。还有卷趴一半程序员的AlphaCode&#xff0c;生成全新蛋白质的ESM2等&#xff0c;不…

TypeScript,终于在实际项目中用到了泛型。

终于在实际项目中用到了泛型 里程碑式的纪录&#xff0c;终于不是anyScript了&#xff0c;代码写完只有一个any 应用 项目中组件化了这么一个东西 功能描述&#xff1a; 传进去一个数组&#xff0c;有个名&#xff0c;有个key&#xff0c;渲染成上图的div样式点击之后&#…

Triple 协议支持 Java 异常回传的设计与实现

作者&#xff1a;陈景明 背景 在一些业务场景&#xff0c;往往需要自定义异常来满足特定的业务&#xff0c;主流用法是在catch里抛出异常&#xff0c;例如&#xff1a; public void deal() {try{//doSomething ...} catch(IGreeterException e) {...throw e;} }或者通过…

Python面向对象(九)

python学习之旅(九) &#x1f44d;查看更多可以关注查看首页或点击下方专栏目录 一.什么是面向对象 万物皆对象 现实世界的事物都有属性和行为,可在程序中抽离为类来描述现实世界的事物属性和行为。 使用类充当程序内现实事物的“设计图纸”&#xff0c;基于图纸(类)生产实体…

10. 正则表达式匹配

题目链接&#xff1a;https://leetcode.cn/problems/regular-expression-matching/从暴力递归到动态规划&#xff0c;对于状态转移方程不容易推导出来的可以先从递归进行尝试各种策略&#xff0c;最后再从暴力递归转为动态规划&#xff0c;这种尝试方式容易求解dp初始值以及dp更…

数据结构-考研难点代码突破 (图关键路径完全解析(流程+代码) - C++代码)

考研在关键路径上的考察以流程为主 文章目录1. AOE网2. 关键路径问题解决流程C代码1. AOE网 首先区分AOV网&#xff1a; AOV网∶若用DAG 图&#xff08;有向无环图&#xff09;表示一个工程&#xff0c;其顶点表示活动&#xff0c;用有向边<Vi&#xff0c;Vj>表示活动 V…

【ESP32+freeRTOS学习笔记-(五)队列Queue】

目录1、什么是队列Queue2、队列的多任务特性2.1 多任务的访问&#xff1a;2.2 队列读取阻塞&#xff1a;2.3 写队列阻塞&#xff1a;2.4 阻塞于多个队列&#xff1a;3、队列的使用3.1 创建队列--The xQueueCreate() API3.2 写入队列3.3 从队列中接收数据3.4 删除队列4、队列集4…

ReactDOM.render在react源码中执行之后发生了什么?

ReactDOM.render 通常是如下图使用&#xff0c;在提供的 container 里渲染一个 React 元素&#xff0c;并返回对该组件的引用&#xff08;或者针对无状态组件返回 null&#xff09;。本文主要是将ReactDOM.render的执行流程在后续文章中会对创建更新的细节进行分析&#xff0c…

MATLAB-plot3/ezplot3三维绘图

&#xff08;1&#xff09; plot3是三维绘图的基本函数&#xff0c;调用格式如下。1、plot3( X,Y,Z):绘制简单的三维曲线&#xff0c;当X、Y、Z是长度相同的向量时&#xff0c;plot3命令将绘制以向量X、Y、Z为(x, y,z)坐标值的三维曲线;当X、Y、Z是mn矩阵时,plot3命令将绘制m条…

Android 虚拟分区详解(四) 编译开关

Android Virtual A/B 系统简称 VAB,我将其称为虚拟分区。 本系列文章基于 Android R(11) 进行分析,如果没有特别说明,均基于代码版本 android-11.0.0_r46 请已经购买《Android 虚拟分区》专栏的朋友加我 wx 进 "虚拟分区专栏 VIP 答疑"群,作为本专栏文章的附加服…

(6)元对象系统与信号与槽机制

1. 元对象系统 元对象系统是一个基于标准C的扩展&#xff0c;为Qt提供了信号与槽机制、实时类型信息、动态属性系统。 什么是元对象 在计算机科学中&#xff0c;元对象是这样一个东西&#xff1a;它可以操纵、创建、描述、或执行其他对象。元对象描述的对象称为基对象。元对象可…

记一次搭建备库,使用连接串主库无法连接到备库

主库使用连接串连接备库失败 SQL> conn sys/oracleorcldg as sysdba ERROR: ORA-12528: TNS:listener: all appropriate instances are blocking new connections 备库已经建立了静态监听 # listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/…

安全寒假第一堂课

一、状态码 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务器超时 1xx&#xff08;临时响应&#xff09; 表示临时响应并需要请求者继续执行操作的状态码。 100&#xff08;继续&#xff09; 请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一…

OpenCV实战(5)——图像运算详解

OpenCV实战&#xff08;5&#xff09;——图像运算详解0. 前言1. 图像基本运算2. 重载图像运算符2.1 加法运算符重载2.2 分割图像通道2.3 完整代码3. 图像重映射3.1 OpenCV 重映射函数3.2 完整代码小结系列链接0. 前言 图像可以以不同的方式进行组合&#xff0c;因为它们是正则…