zl程序教程

您现在的位置是:首页 >  工具

当前栏目

【QT】Qt 中 Json 的操作

QtJSONJSON 操作
2023-09-11 14:16:59 时间

以下是代码详列:

一、jsondata.h

#ifndef JSONDATA_H
#define JSONDATA_H

#include <QWidget>
#include <QJsonDocument>    // 解析Json
#include <QJsonArray>       // [ ]
#include <QJsonObject>      // { }
#include <QJsonValue>       // int float double null { } [ ]
#include <QJsonParseError>

#include <QFile>
#include <QDebug>
#include <QTextStream>

namespace Ui {
class JsonData;
}

class JsonData : public QWidget
{
    Q_OBJECT

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

private:
    Ui::JsonData *ui;

public:
    void createJson();
    void analysisJson();
    void alterJson();
    void delJson();

};

#endif // JSONDATA_H

二、jsondata.cpp

#include "jsondata.h"
#include "ui_jsondata.h"

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

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

// 封装Json
void JsonData::createJson()
{
    QJsonObject argumentsObject;
    argumentsObject.insert("video",1);
    argumentsObject.insert("rpm",1);
    argumentsObject.insert("range",1);
    argumentsObject.insert("error",1);
    argumentsObject.insert("source",1);
    argumentsObject.insert("state",1);
    argumentsObject.insert("gain",1);
    argumentsObject.insert("tune",1);
    argumentsObject.insert("snow",1);
    argumentsObject.insert("wave",1);

//    QJsonObject arguments;
//    arguments.insert("",argumentsObject);

    // 定义数组对象 [ ]
    QJsonArray arguments;
    arguments.append(argumentsObject);

    QJsonObject content;
    content.insert("arguments",arguments);

    // 定义根节点,即是最外层 { }
    QJsonObject rootObject;

    // 插入元素
    rootObject.insert("id",1);
    rootObject.insert("method","notice-event");
    rootObject.insert("content",content);

    // 将json对象里的数据转换为字符串
    QJsonDocument doc;
    // 将object设置位本文档的主要对象
    doc.setObject(rootObject);

    QFile file("../Json/data.json");
    if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
    {
        qDebug() << " can't open error! ";
        return;
    }

    QTextStream stream(&file);
    stream.setCodec("UTF-8");

    stream << doc.toJson();
    file.close();
}

// 解析Json
void JsonData::analysisJson()
{
    QFile file("../Json/data.json");
    if(!file.open(QFile::ReadOnly | QFile::Text))
    {
        qDebug() << " can't open error! ";
        return;
    }

    // 读取文件的全部内容
    QTextStream stream(&file);
    stream.setCodec("UTF-8");
    QString str = stream.readAll();

    file.close();

    // 用于在JSON解析期间报告错误
    QJsonParseError jsonError;
    // 将json解析为UTF-8编码的json文档,并从中创建一个QJsonDocument。
    QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(),&jsonError);
    // 如果解析成功,返回QJsonDocument对象,否则返回null
    if(jsonError.error != QJsonParseError::NoError && !doc.isNull())
    {
        qDebug() << "Json格式错误!" << jsonError.error;
        return;
    }

    // 获取根 { }
    QJsonObject rootObj = doc.object();

    // 根据键获取值
    QJsonValue idValue = rootObj.value("id");
    qDebug() << "id = " << idValue.toInt();

    QJsonValue methodValue = rootObj.value("method");
    qDebug() << "method = " << methodValue.toString();

    // 解析对象 {}
    QJsonValue contentValue = rootObj.value("content");
    if(contentValue.type() == QJsonValue::Object)
    {
        QJsonObject contentObj = contentValue.toObject();

        // 解析数组中的对象 [ { } ]
        QJsonValue argumentsValue = contentObj.value("arguments");
        if(argumentsValue.type() == QJsonValue::Array)
        {
            QJsonArray argumentsArray = argumentsValue.toArray();

            for(int i = 0; i < argumentsArray.count(); i++)
            {
                QJsonValue argumentsValueChild = argumentsArray.at(i);

                if(argumentsValueChild.type() == QJsonValue::Object)
                {
                    QJsonObject argumentsObj = argumentsValueChild.toObject();

                    QJsonValue videoArgumentValue = argumentsObj.value("video");
                    qDebug() << "video = " << videoArgumentValue.toInt();

                    QJsonValue rpmArgumentValue = argumentsObj.value("rpm");
                    qDebug() << "rpm = " << rpmArgumentValue.toInt();

                    QJsonValue rangeArgumentValue = argumentsObj.value("range");
                    qDebug() << "range = " << rangeArgumentValue.toInt();

                    QJsonValue errorArgumentValue = argumentsObj.value("error");
                    qDebug() << "error = " << errorArgumentValue.toInt();

                    QJsonValue sourceArgumentValue = argumentsObj.value("source");
                    qDebug() << "source = " << sourceArgumentValue.toInt();

                    QJsonValue stateArgumentValue = argumentsObj.value("state");
                    qDebug() << "state = " << stateArgumentValue.toInt();

                    QJsonValue gainArgumentValue = argumentsObj.value("gain");
                    qDebug() << "gain = " << gainArgumentValue.toInt();

                    QJsonValue tuneArgumentValue = argumentsObj.value("tune");
                    qDebug() << "tune = " << tuneArgumentValue.toInt();

                    QJsonValue snowArgumentValue = argumentsObj.value("snow");
                    qDebug() << "snow = " << snowArgumentValue.toInt();

                    QJsonValue waveArgumentValue = argumentsObj.value("wave");
                    qDebug() << "wave = " << waveArgumentValue.toInt();
                }
            }

        }
    }
}

// 修改Json数据
void JsonData::alterJson()
{
    QFile readFile("../Json/data.json");
    if(!readFile.open(QFile::ReadOnly | QFile::Truncate))
    {
        qDebug() << " can't open error! ";
        return;
    }

    //读取文件的全部内容
    QTextStream readStream(&readFile);
    readStream.setCodec("UTF-8");
    QString str = readStream.readAll();
    readFile.close();

    QJsonParseError jsonError;

    QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(),&jsonError);
    if(jsonError.error != QJsonParseError::NoError && !doc.isNull())
    {
        qDebug() << "Json格式错误!" << jsonError.error;
        return;
    }

    QJsonObject rootObj = doc.object();

    // 修改属性
    rootObj["id"] = 3588;
    rootObj["method"] = "response-event";

    QJsonValue contentValue = rootObj.value("content");
    if(contentValue.type() == QJsonValue::Object)
    {
        QJsonObject contentObj = contentValue.toObject();

        QJsonValue argumentsValue = contentObj.value("arguments");
        if(argumentsValue.type() == QJsonValue::Array)
        {
            QJsonArray argumentsArray = argumentsValue.toArray();

            QJsonObject obj = argumentsArray[0].toObject();
            obj["range"] = 120;
            obj["state"] = 9;
        }

    }

    doc.setObject(rootObj);

    // 重新打开文件,覆盖原有文件
    QFile writeFile("../Json/store.json");
    if(!writeFile.open(QFile::WriteOnly | QFile::Truncate))
    {
        qDebug() << "can't open error!";
        return;
    }

    // 将修改后的内容写入文件
    QTextStream writeStream(&writeFile);
    writeStream.setCodec("UTF-8");       // 设置读取编码是UTF8
    writeStream << doc.toJson();         // 写入文件
    writeFile.close();                   // 关闭文件
}

// 删除Json
void JsonData::delJson()
{
    QFile readFile("../Json/store.json");
    if(!readFile.open(QFile::ReadOnly | QFile::Truncate))
    {
        qDebug() << "can't open error!";
        return;
    }

    // 读取文件的全部内容
    QTextStream readStream(&readFile);
    readStream.setCodec("UTF-8");
    QString str = readStream.readAll();
    readFile.close();

    QJsonParseError jsonError;

    QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(),&jsonError);
    if(jsonError.error != QJsonParseError::NoError && !doc.isNull())
    {
        qDebug() << "Json格式错误!" << jsonError.error;
        return;
    }

    QJsonObject rootObj = doc.object();

    rootObj.remove("id");

    QJsonValue contentValue = rootObj.value("content");
    if(contentValue.type() == QJsonValue::Object)
    {
        QJsonObject contentObj = contentValue.toObject();

        QJsonValue argumentsValue = contentObj.value("arguments");
        if(argumentsValue.type() == QJsonValue::Array)
        {
            QJsonArray argumentsArray = argumentsValue.toArray();

            argumentsArray.removeAt(0);

            contentObj["arguments"] = argumentsArray;
        }
    }


    doc.setObject(rootObj);

    QFile writeFile("../Json/del.json");
    if(!writeFile.open(QFile::WriteOnly | QFile::Truncate))
    {
        qDebug() << "can't open error!";
        return;
    }

    QTextStream writeStream(&writeFile);
    writeStream.setCodec("UTF-8");
    writeStream << doc.toJson();
    writeFile.close();

}

三、main.cpp

#include "jsondata.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    JsonData w;
    //w.show();

    JsonData* json = new JsonData();
    json->createJson();
    json->analysisJson();
    json->alterJson();
    json->delJson();
    return a.exec();
}

四、运行后的Json文件

1、data.json:
在这里插入图片描述
2、QT控制栏应用程序输出:
在这里插入图片描述
3、store.json:
在这里插入图片描述
好像代码有点儿小问题,欢迎uu们来指正