QT JSON操作

头文件.h

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_JsonTest.h"

class JsonTest : public QMainWindow
{
    Q_OBJECT

public:
    JsonTest(QWidget *parent = Q_NULLPTR);


public slots:
    void createJson();
    void readJosn();
private:
    Ui::JsonTestClass ui;
};

源文件.cpp

#include "JsonTest.h"
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonValue>

#include <QDir>
#include <QFile>
#include <QDebug>
#include <QString>
#include <QDateTime>

#include <iostream>
JsonTest::JsonTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(createJson()));
    connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(readJosn()));

    
}
void JsonTest::createJson() //写入json的槽函数
{
//创建json文件
    QFile filejson_1(QApplication::applicationDirPath()+QDir::separator()+"json1");
    if (!filejson_1.open(QIODevice::ReadWrite))
    {
        qDebug() << QString::fromLocal8Bit("json1 文件打开失败!");
    }
    else
    {
        qDebug() << QString::fromLocal8Bit("json1 文件打开成功!");
    }
    
//创建一个json数组
    QJsonArray array1;
    
    array1.append(QString::number(0.22));
    array1.append(QString::number(12.2));
    array1.append(QString::number(145.01));
    array1.append(QString::number(24.0));
    array1.append(QString::number(14.4));
    array1.append(QString::number(0.1));

    QJsonArray array2;

    array2.append(QString::number(1.3));
    array2.append(QString::number(1.4));
    array2.append(QString::number(1.5));
    array2.append(QString::number(1.6));
    array2.append(QString::number(1.7));
    array2.append(QString::number(1.8));
//创建json对象(键值对的集合)    
    QJsonObject jsonobject1;
    jsonobject1.insert("name","tom");
    jsonobject1.insert("array", array1);
    

    QJsonObject jsonobject2;
    jsonobject2.insert("name", "bon");
    jsonobject2.insert("array", array2);
    

    

//将集合放入到jsonarray中
    QJsonArray jsonarray1;
    jsonarray1.append(jsonobject1);
    jsonarray1.append(jsonobject2);

//创建Document对象(读写json文档)
    QJsonDocument jsondocument1;
    jsondocument1.setArray(jsonarray1);
    

//写入到 json文件中
    filejson_1.write(jsondocument1.toJson());

//关闭文件
    filejson_1.close();

}
void JsonTest::readJosn() //读取josn的槽函数
{
//保存从json文件里面,读取到的数据
    QJsonArray tempJsonArray;
//打开json文件
    qDebug() << QString::fromLocal8Bit("读取json文件");
    QFile readJsonFile(QApplication::applicationDirPath() + QDir::separator() + "json1");
    if (!readJsonFile.open(QIODevice::ReadWrite)) //!true
    {
        
        qDebug() <<QString::fromLocal8Bit("读取json文件——打开文件失败!") ;
        qDebug() << !readJsonFile.open(QIODevice::ReadWrite);
    }
    else
    {
        qDebug() << QString::fromLocal8Bit("读取json文件——打开文件成功!");
        qDebug() << !readJsonFile.open(QIODevice::ReadWrite);
    }

//创建QjsonParseError 对象,对josn文件进行解析
    QJsonParseError jsonparsererror;

//创建QjsonDocument 对象,进行读json文件内容
    //将json文件里面的数据,存储到QJsonDocument
    QJsonDocument jsonDocument = QJsonDocument::fromJson(readJsonFile.readAll(), &jsonparsererror); 

    //进行解析json,如果没问题开始处理解析后的数据
    if (!jsonDocument.isNull() && jsonparsererror.error == QJsonParseError::NoError)
    {
        std::cout << "文件解析成功!"<<endl;
        qDebug() << (jsonDocument.isNull() && jsonparsererror.error == QJsonParseError::NoError);

        //将存储json数据的QJsonDocument转换成数据保存到 QJsonArray对象中
        QJsonArray jarray = jsonDocument.array();
        qDebug() << jarray;

        for (int i = 0; i < jarray.count(); i++)
        {
            //从jsonarray数据中获取json对象(键值对)
            auto _jsonobject = jarray[i].toObject();


            //将键名 找到值,赋值给_name
            QString _name = _jsonobject.value("name").toString();
            qDebug() << _name;


            if (_name == "bon") {
                //拿到键所对应的值(值是数组)
                tempJsonArray = _jsonobject.value("array").toArray();
            }

        }
        //通过数组的索引值,取到对应的数据
        auto a = tempJsonArray.at(0).toString();

        //打印取到的值
        qDebug() << a.toDouble();
    }
    else {
        std::cout << "文件解析失败!" << endl;
    }
    readJsonFile.close();
    
}

 

效果

 

 

 

posted @ 2022-06-01 15:35  雾枫  阅读(70)  评论(0编辑  收藏  举报