0
我需要将QML源代码存储在JSON文件中,以便保存格式(换行符和间距以及whatnot)。我想过以编程方式插入特殊的unicode字符,这些字符在我的源代码中不会用作标记到JSON(保存时)以表示新的行和空格。从JSON读取源代码时,我会用换行符或空格替换这些标记。但是,这并不像一个非常强大的解决方案。将格式化的QML源代码存储在JSON文件中
有没有更好的方法来做到这一点?
我需要将QML源代码存储在JSON文件中,以便保存格式(换行符和间距以及whatnot)。我想过以编程方式插入特殊的unicode字符,这些字符在我的源代码中不会用作标记到JSON(保存时)以表示新的行和空格。从JSON读取源代码时,我会用换行符或空格替换这些标记。但是,这并不像一个非常强大的解决方案。将格式化的QML源代码存储在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文件将从压缩中受益。
当你在它的时候,你也可能压缩字节数组以保存在内存中。 – dtech
哦,我甚至不知道有这个功能。谢谢! – Mitch
@dtech'QString(qCompress(mQml.toUtf8()。toBase64(),9))'似乎导致一个空字符串 - 我如何将'QByteArray'转换为'QString',哪个'QJsonObject'需要? – Mitch