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