Qt C++:从QJsonValue转换为QByteArray

4

我有一个很大(几兆字节)的字符串在QJsonValue中,我需要将其转换为QByteArray,因为我要将该字符串作为数据发送给QNetworkRequest

目前我正在这样做:

myQJsonObject["myQJsonValue"].toString().toUtf8()

如果这样做会导致同一数据多次复制到内存中,该怎么实现而又不会产生不必要的复制呢?

2个回答

4

为什么不使用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());
}

这是一个非常有趣的建议,非常感谢。 - Miika Pirttilä
使用QJsonDocument构造函数并将大型QJsonObject作为参数传递,是否会产生额外的费用? - Miika Pirttilä
问题是你发送给服务器的是什么?我怀疑这不是一个单独的 QJsonValue。它必须是一个 QJsonArrayQJsonObject。我从未见过一个发送或接受单个 JSon 值的服务器。这就是为什么 QJsonDocument 没有 QJsonValue 的构造函数的原因。 - Marek R
这是一个很大的JSON块,我将其保存(或更新)在用户的Dropbox帐户中,作为.json文件。 - Miika Pirttilä
这里的嵌套QJsonValue包含一个大的json对象。我认为toBinaryData()应该没问题,因为虽然我将文件保存为.json,但服务器无需将数据解释为json,因此内容类型可以是application/octet-stream。 - Miika Pirttilä

1
调用myQJsonObject["myQJsonValue"].toString()由于Qt的写时复制语义,不涉及数据复制。 toUtf8调用代价高昂。 QString将数据存储为Unicode(16位QChar),将其编码为UTF-8涉及更多的数据复制。 QString :: constData()返回指向底层字符数组的指针。但是,每个字符由2个字节表示,而不是在Utf-8的情况下为1或2个字节。这可能意味着通过网络发送两倍的数据量。
因此,如果您的数据主要包含ASCII字符,则UTF-8可能是更好的选择。 如果它包含大量非Ascii字符,并且另一端可以处理UTF-16,则值得考虑UTF-16。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接