如何将QJsonDocument保存并加载到文件?

Mar*_*dik 6 c++ qt json qt5

我正在尝试学习如何使用JSONQt JSON类.例如,我想创建一个简单的QJsonDocument,将其保存到文件,将其加载到另一个文件QJsonDocument并比较结果.

我成功创造了一个QJsonDocument.但是,QJsonDocument 界面中没有简单的命令将其保存到文件中.这同样适用于加载该文件中的文件.

#include <QJsonObject>
#include <QJsonDocument>
#include <QVariant>

int main()
{
    QVariantMap map;
    map.insert("integer", 1);
    map.insert("double", 2.34);
    map.insert("bool", QVariant(true));
    map.insert("string", "word");
    QJsonObject object = QJsonObject::fromVariantMap(map);

    QJsonDocument document;
    document.setObject(object);

    // ?? save document to file
    // ?? load file to document

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个答案显示了如何加载文档

  1. 读到一个 QFile
  2. 转换QFileQString
  3. 转换QStringQByteArray
  4. QJsonDocument从中构建QByteArray

有没有更简单的方法来做到这一点?

Joh*_*ick 39

就个人而言,我认为[你链接到的]代码看起来有点混乱.警告:头编译代码如下.

QJsonDocument loadJson(QString fileName) {
    QFile jsonFile(fileName);
    jsonFile.open(QFile::ReadOnly);
    return QJsonDocument().fromJson(jsonFile.readAll());
}

void saveJson(QJsonDocument document, QString fileName) {
    QFile jsonFile(fileName);
    jsonFile.open(QFile::WriteOnly);
    jsonFile.write(document.toJson());
}
Run Code Online (Sandbox Code Playgroud)

这可能不完美:它假定QFile代替QIODevice,但如果你只处理本地文件,也许无关紧要.然后,您可以使用这些函数,而不是每次需要加载/保存Json时重复Json加载/保存代码.

  • 从内存的角度来看,这不是最好的,因为 json 首先作为 QByteArray 从文件加载到内存中,然后解析字节数组以生成 Json 文档。因此,您会因为同时将原始文本和 Json 保存在内存中而获得峰值。在 PC 上这并不重要,但当内存有限时就很重要了。将文件 QFile::map() 放入内存然后使用 QByteArray::fromRawData 可能会更有效。 (2认同)

Shf*_*Shf 2

无需转换为字符串并返回。使用QSettingsQVariant类,您可以轻松做到这一点。从创建QVariant对象QJsonDocument并将其保存为QSettings. 查看函数QJsonDocument::fromVariantQJsonDocument::toVariant。将它们与QSettings类结合起来,特别是void QSettings::setValue ( const QString & key, const QVariant & value )方法,它可以很好地工作QVariant,就是这样。

该类还QSettings具有此构造函数QSettings::QSettings ( const QString & fileName, Format format, QObject * Parent = 0 ) ,它允许您设置文件fileName变量的路径

  • 这是一些复杂的建议。为什么要通过“QSettings”?最直接的方法是使用 document.toJson() 来获取 UTF-8 编码的 Json 文本。 (3认同)
  • @Shf:问题是关于 json 文件,而不是关于设置。是你假设它是用来存储设置的。如果要存储设置,则 json 根本没有意义,只需直接使用 QSettings 即可。为什么要添加另一层间接层? (2认同)