如何将 QJsonDocument 保存并加载到文件中?
Posted
技术标签:
【中文标题】如何将 QJsonDocument 保存并加载到文件中?【英文标题】:How to save and load a QJsonDocument to a file? 【发布时间】:2014-01-21 13:51:32 【问题描述】:我正在尝试学习如何使用 JSON 和 Qt JSON 类。例如,我想创建一个简单的QJsonDocument
,将其保存到文件中,将其加载到不同的QJsonDocument
并比较结果。
我设法创建了一个QJsonDocument
。但是,QJsonDocument
interface 中没有简单的命令将其保存到文件中。从文件加载文档也是如此。
#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 显示如何加载文档
-
阅读到
QFile
将QFile
转换为QString
将QString
转换为QByteArray
从QByteArray
构造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表内每行的数据复制到文本文档内,但文本里显示不要分行,以,号隔开就行了