当前位置 博文首页 > 若梦的博客:使用Qt读写JSON文件(一)——简单的写入文件

    若梦的博客:使用Qt读写JSON文件(一)——简单的写入文件

    作者:[db:作者] 时间:2021-07-26 21:00

    简介

    介绍使用Qt读写JSON文件。如果你对JSON不是很了解,请阅读我之前的一篇文章json简介。
    使用的开发环境为:

    Qt 5.12.0+Deepin 15.8

    在Qt中与JSON相关的类有以下几个,Q=QJsonDocument,QJsonArray,QJsonObject,QJsonParseError,QJsonValue。

    5656674-6142906de3199b60.png

    json

    其中QJsonDocument类提供了读写JSON文档的方式,我们可以通过该类的方法QJsonDocument::fromJson()将一个JSON文档转换成QJsonDocument类,或者通过QJsonDocument::toJson()和QJsonDocument::toBinaryData()函数将一个QJsonDocument类转换为QByteArray,这样我们就可以很轻松地将其写入文件。

    QJsonArray封装了JSON中的数组。
    QJsonObject封装了JSON中的对象。
    QJsonValue封装了JSON中的值。
    QJsonParseError 用于报告JSON解析中的错误类型。

    使用QJsonObject简单演示

    首先,我们使用Qt creator创建一个Qt Console Application项目,项目名称位置可随意。

    5656674-e0f1e7465eaf8d10.png

    creator

    修改main.cpp中的代码如下所示

    #include <QJsonArray>
    #include <QJsonDocument>
    #include <QJsonObject>
    #include <QJsonParseError>
    #include <QJsonValue>
    #include <QString>
    #include <QDebug>
    #include <QFile>
    #include <QDateTime>
    #include <QDir>
    
    int main(int argc, char *argv[]) {
    // 以读写方式打开主目录下的1.json文件,若该文件不存在则会自动创建
        QFile file(QDir::homePath() + "/1.json");
        if(!file.open(QIODevice::ReadWrite)) {
            qDebug() << "File open error";
        } else {
            qDebug() <<"File open!";
        }
    // 使用QJsonObject对象插入键值对。
        QJsonObject jsonObject;
        jsonObject.insert("name", "tom");
        jsonObject.insert("age", "18");
        jsonObject.insert("time", QDateTime::currentDateTime().toString());
    
    // 使用QJsonDocument设置该json对象
        QJsonDocument jsonDoc;
        jsonDoc.setObject(jsonObject);
    
    // 将json以文本形式写入文件并关闭文件。
        file.write(jsonDoc.toJson());
        file.close();
    
        qDebug() << "Write to file";
        return 0;
    }
    

    之后打开你的终端(linux环境下), 会看到我们的程序在主目录下生成了一个1.json的文件。然后查看下里面的内容。

    5656674-af3755c73141a3bf.png

    json file

    不知道你有没有注意到,我们在jsonObject中插入键值对的顺序和文件中的键值对顺序不太一样,这是因为JSON中的object本身是指无序的键值对,它不能确保我们插入的顺序和实际保存的数据顺序一致。如果你的数据需要顺序一致,考虑JSON中的array,array是值的有序列表。

    5656674-5ac3801b6e3d5fc7.png

    code

    简单使用QJsonArray

    修改main.cpp中的代码如下,注:该代码会清空主目录先1.json的原有内容,如果你想保留原有的文件内容,请备份或者修改写入的文件名。

    #include <QJsonArray>
    #include <QJsonDocument>
    #include <QJsonObject>
    #include <QJsonParseError>
    #include <QJsonValue>
    #include <QString>
    #include <QDebug>
    #include <QFile>
    #include <QDateTime>
    #include <QDir>
    
    int main(int argc, char *argv[]) {
        // 以读写方式打开主目录下的1.json文件,若该文件不存在则会自动创建
        QFile file(QDir::homePath() + "/1.json");
        if(!file.open(QIODevice::ReadWrite)) {
            qDebug() << "File open error";
        } else {
            qDebug() <<"File open!";
        }
    
        // 清空文件中的原有内容
        file.resize(0);
    
        // 使用QJsonArray添加值,并写入文件
        QJsonArray jsonArray;
        jsonArray.append("name");
        jsonArray.append(18);
        jsonArray.append(QDateTime::currentDateTime().toString());
    
        QJsonDocument jsonDoc;
        jsonDoc.setArray(jsonArray);
    
        file.write(jsonDoc.toJson());
        file.close();
    
        qDebug() << "Write to file";
        return 0;
    }
    

    这次文件中的数据顺序,和我们扩展JSON数组中的顺序是一致的。

    ?

    5656674-71a6729f02e40989.png

    jsonArray

    稍微复杂的例子

    我们注意到JSON中的值可以是字符串、数组、对象、数字等,因此我们试试结合使用一下。

    #include <QJsonArray>
    #include <QJsonDocument>
    #include <QJsonObject>
    #include <QJsonParseError>
    #include <QJsonValue>
    #include <QString>
    #include <QDebug>
    #include <QFile>
    #include <QDateTime>
    #include <QDir>
    #include <QThread>
    
    int main(int argc, char *argv[]) {
        // 以读写方式打开主目录下的1.json文件,若该文件不存在则会自动创建
        QFile file(QDir::homePath() + "/1.json");
        if(!file.open(QIODevice::ReadWrite)) {
            qDebug() << "File open error";
        } else {
            qDebug() <<"File open!";
        }
    
        // 清空文件中的原有内容
        file.resize(0);
    
        // 使用QJsonArray添加值,并写入文件
        QJsonArray jsonArray;
    
        for(int i = 0; i < 3; i++) {
            QJsonObject jsonObject;
            jsonObject.insert("name", QString::number(i+1));
            jsonObject.insert("age", i+18);
            jsonObject.insert("time", QDateTime::currentDateTime().toString());
            jsonArray.append(jsonObject);
            QThread::sleep(2);
        }
    
        QJsonObject jsonObject;
        jsonObject.insert("number", jsonArray.size());
        jsonArray.append(jsonObject);
    
        QJsonDocument jsonDoc;
        jsonDoc.setArray(jsonArray);
    
        file.write(jsonDoc.toJson());
        file.close();
    
        qDebug() << "Write to file";
        return 0;
    }
    

    结果如下所示

    ?

    5656674-a4862be6e269b73f.png

    3

    cs
    下一篇:没有了