我需要将QML源代码存储在JSON文件中,以便保留格式(换行符和间距等)。我想过以编程方式将我在源代码中永远不会使用的特殊unicode字符作为标记插入JSON(保存时)以表示新的行和空格。从JSON读取源代码时,我会用换行符或空格替换这些标记。但是,这并不是一个非常强大的解决方案。
有更好的方法吗?
答案 0 :(得分:1)
您可以使用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文件将从压缩中受益。