无需额外副本即可阅读 QJsonDocument

问题描述 投票:0回答:1

我正在尝试阅读

QJsonDocument
,并且我想最大程度地减少复印数量。当我阅读其他人的示例代码时,看起来他们只是为了读取而制作了两到三个数据副本。部分问题是我不知道什么是文档的副本以及什么本质上是指向文档的指针。

文档没有多大帮助。这是我的想象,但我认为这不准确:

  • QJsonDocument
    就像顶层
    QJsonObject
    一样,提供文档级成员函数。它存储整个文档。
  • QJsonObject
    是一个有序的树状对象,其中节点对应于键。我认为
    QJsonObject
    会保留它所指向的文档部分的副本,尽管这样做效率很低。
  • QJsonValueRef
    就像对
    QJsonObject
    的引用,尽管我不知道为什么不使用迭代器而不是
    QJsonValueRef
    。如果不复制
    QJsonValueRef
    的内容,似乎也很难使用
    QJsonObject

假设我们想从此 json 中读取“Street”、“City”和“County”:

{
    "FirstName": "John",
    "LastName": "Doe",
    "MiddleName": null,
    "Age": 43,

    "Address": {
        "Street": "Downing Street 10",
        "City": "London",
        "Country": "Great Britain"
    },
    "Phone numbers": [
        "+44 1234567",
        "+44 2345678"
    ]
    "Valid":true,
}

This stackoverflow 答案提供了以下解决方案。我已经为我的问题编号了一些行。

QJsonObject jsonObj = jsonDoc.object(); // (1)
QTextStream textStream(stdout);

QJsonValue jsonVal = jsonObj.value(QString("Address")); // (2)
QJsonObject jsonItemObj = jsonVal.toObject(); // (3)

QJsonValue jsonSubVal;

jsonSubVal = jsonItemObj["Street"]; // (4)
textStream << jsonSubVal.toString() << endl; // (5)

jsonSubVal = jsonItemObj["City"];
textStream << jsonSubVal.toString() << endl;

jsonSubVal = jsonItemObj["Country"];
textStream << jsonSubVal.toString() << endl;

(1)-(5)中,哪些是副本?有没有办法消除这些副本? (在第(5)行中,我指的是

jsonSubVal.toString()
而不是
textStream <<
。)

c++ json qt io copy-elision
1个回答
0
投票

value()
按值返回,因此始终是副本。

operator[]
在非常量对象上使用时返回引用,但在常量对象上调用时按值返回。请注意,如果请求的密钥不存在,非常量版本将修改对象。

为了避免复制,您可以使用

find
它返回迭代器。

© www.soinside.com 2019 - 2024. All rights reserved.