我有一个很大(几兆字节)的字符串在QJsonValue
中,我需要将其转换为QByteArray
,因为我要将该字符串作为数据发送给QNetworkRequest
。
目前我正在这样做:
myQJsonObject["myQJsonValue"].toString().toUtf8()
如果这样做会导致同一数据多次复制到内存中,该怎么实现而又不会产生不必要的复制呢?
为什么不使用QJsonDocument
?这应该用于读写。有一个方法QJsonDocument::toBinaryData可以使用。这个API应该是最有效的方式。
单个JSon值必须是其他JSon类型之一:对象、字符串或某些数字。我很确定你有JSon对象。所以你的代码应该像这样:
JSonValue val = someJsond["someKey"];
if (val.isObject()) {
QJSonDocument doc(val.toObject());
SendToServer(doc.toBinaryData());
} else {
// error or:
SendToServer(val.toString().toUtf8());
}
myQJsonObject["myQJsonValue"].toString()
由于Qt的写时复制语义,不涉及数据复制。
toUtf8
调用代价高昂。 QString
将数据存储为Unicode(16位QChar
),将其编码为UTF-8涉及更多的数据复制。
QString :: constData()
返回指向底层字符数组的指针。但是,每个字符由2个字节表示,而不是在Utf-8的情况下为1或2个字节。这可能意味着通过网络发送两倍的数据量。
QJsonValue
。它必须是一个QJsonArray
或QJsonObject
。我从未见过一个发送或接受单个 JSon 值的服务器。这就是为什么QJsonDocument
没有QJsonValue
的构造函数的原因。 - Marek R