今天看啥  ›  专栏  ›  若梦儿

使用Qt读写JSON文件(一)——简单的写入文件

若梦儿  · 简书  ·  · 2018-12-18 20:07

简介

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

Qt 5.12.0+Deepin 15.8

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

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项目,项目名称位置可随意。

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的文件。然后查看下里面的内容。

json file

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

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数组中的顺序是一致的。


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

结果如下所示


3



原文地址:访问原文地址
快照地址: 访问文章快照