我需要将QML源代码存储在JSON文件中,以便保留格式(换行符和间距等(。我考虑以编程方式将我永远不会在源代码中使用的特殊 unicode 字符作为标记插入 JSON(保存时(以表示新行和空格。从 JSON 读取源代码时,我会用换行符或空格替换这些标记。但是,这感觉不是一个非常强大的解决方案。
有没有更好的方法可以做到这一点?
QByteArray::toBase64()
将 QML 源转换为可保存为 JSON 的字符串:
void SourceCodeSerialiser::read(const QJsonObject &json)
{
mQml = QByteArray::fromBase64(json["qml"].toString().toUtf8());
}
QByteArray::toBase64()
将保存的 Base64 字符串读回 QML 字符串:
void SourceCodeSerialiser::write(QJsonObject &json) const
{
json["qml"] = QString(mQml.toUtf8().toBase64());
}
( mQml
是一个QString
(
这将转换以下 QML:
import QtQuick 2.0
Item {
id: item
}
进入这个 Base64 字符串:
aW1wb3J0IFF0UXVpY2sgMi4wCgpJdGVtIHsKICAgIGlkOiBpdGVtCn0=
正如@dtech提到的,也可以使用 qCompress()
和 qUncompress()
压缩字节数组以节省一些内存:
void SourceCodeSerialiser::read(const QJsonObject &json)
{
mQml = qUncompress(QByteArray::fromBase64(json["qml"].toString().toUtf8()));
}
void SourceCodeSerialiser::write(QJsonObject &json) const
{
json["qml"] = QString(qCompress(mQml.toUtf8(), 9).toBase64());
}
这将生成以下 Base64 字符串:
AAAAKXjay8wtyC8qUQgsCSzNTM5WMNIz4OLyLEnNVajmUgCCzBQrhUwgl6sWABKDDFM=
这比未压缩的版本大,因为 QML 代码段太小了。较大的 QML 文件将受益于压缩。