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

Posted

技术标签:

【中文标题】如何将 QJsonDocument 保存并加载到文件中?【英文标题】:How to save and load a QJsonDocument to a file? 【发布时间】:2014-01-21 13:51:32 【问题描述】:

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

我设法创建了一个QJsonDocument。但是,QJsonDocumentinterface 中没有简单的命令将其保存到文件中。从文件加载文档也是如此。

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

This answer 显示如何加载文档

    阅读到QFileQFile 转换为QStringQString 转换为QByteArrayQByteArray 构造QJsonDocument

有没有更直接的方法来做到这一点?

【问题讨论】:

【参考方案1】:

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

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());

这可能并不完美:它假定QFile 而不是QIODevice,但如果您只处理本地文件,则可能没关系。然后,您可以使用这些函数,而不是每次需要加载/保存 Json 时都重复 Json 加载/保存代码。

【讨论】:

谢谢!这两个答案对我来说同样有价值 我个人通过例子学得更快,所以我更喜欢这个答案更多,但是是的,它们都很好! 从内存的角度来看,这不是最好的,因为 json 首先作为 QByteArray 从文件加载到内存中,然后解析字节数组以生成 Json 文档。所以你会因为一次在内存中保存原始文本和 Json 而得到一个峰值。在 PC 上这无关紧要,但当内存受限时,它就很重要了。将文件 QFile::map() 到内存中然后在其上使用 QByteArray::fromRawData 可能更有效。【参考方案2】:

无需转换为字符串并返回。使用QSettings 和QVariant 类,您可以轻松做到这一点。从QJsonDocument 创建QVariant 对象并将其保存为QSettings。查看函数QJsonDocument::fromVariant 和QJsonDocument::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 将 QVariant 保存到文件中? AFAIK QSettings 将应用程序设置保存到确定的特定于平台的位置,而不是文件。 @MartinDrozdik 我已经编辑了答案。您可以构造 QSettings 对象并从您想要的位置打开。 QSetting 类也将它的所有值存储在 QVariant 中,这正是我们使用 QJsonDocument 所需要的。 这是一些令人费解的建议。为什么要通过QSettings?直接的方法是使用document.toJson() 来获取UTF-8 编码的Json 文本。 @Shf:QSettings 会将 json 存储为 .ini 格式的键的字符串(或二进制!)值。这充其量是脑残。读取此类文件时,QSettings 必须从中解析出值。为此使用 QSettings 完全没有意义。在我看来,您实际上并没有使用它,也没有查看生成的文件。 @Shf:问题是关于 json 文件,而不是设置。是您假定它用于存储设置。如果要存储设置,json根本没有意义,直接使用QSettings就行了。为什么要添加另一层间接?

以上是关于如何将 QJsonDocument 保存并加载到文件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 pusher.com 的“序列化”json 解析为 qt5 QJsonDocument?

如何将EXCEL表内每行的数据复制到文本文档内,但文本里显示不要分行,以,号隔开就行了

如何将cmd中的命令输出到文本区域

QJsonDocument::array() 和 QJsonDocument::object()

如何将 keras 模型与其他数据一起保存并完全加载?

如何将此内容输出到文本区域?