将格式化的QML源代码存储在JSON文件中

时间:2017-05-28 09:24:03

标签: json qt qml

我需要将QML源代码存储在JSON文件中,以便保留格式(换行符和间距等)。我想过以编程方式将我在源代码中永远不会使用的特殊unicode字符作为标记插入JSON(保存时)以表示新的行和空格。从JSON读取源代码时,我会用换行符或空格替换这些标记。但是,这并不是一个非常强大的解决方案。

有更好的方法吗?

1 个答案:

答案 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());
}

mQmlQString

这将改变以下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文件将从压缩中受益。