gpt4 book ai didi

c++ - 在 Qt 中迭代和修改 JSON

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:38 24 4
gpt4 key购买 nike

我需要使用 JSON 通过网络传输大量数据,然后在高流量和性能要求高的场景中在运行时在 Qt 中解释它。基本上需要处理任意大小和复杂性的数百甚至数千或更多 JSON 文档。我在如何做这件事上有些自由,但我正在仔细考虑我的选择,到目前为止,我对它们看起来的样子并不满意。

主要关注的是查找和修改速度,而从/到 JSON 的转换在我的上下文中不太重要,因为我可以处理较慢的摄入量和/或无论如何都会不稳定的输出。但是一旦数据通过,它就需要随时可用。

我的选择:

1) 选项 1 是直接使用 Qt 5 中的 JSON 支持类。然而,缺点是为了修改 JSON 数据树中某处的单个值,需要复制整个内容,然后使用修改后的值再次从中创建 JSON。这对于单个修改来说可能是相当昂贵的。 QJsonValueRef 在某种程度上对此有所帮助,但不允许遍历整个结构,因为结构中的每个对象仍需要复制。

2) 将 JSON 转换为 QVariantMap (QMap) 并使用它。除了来回转换的开销之外,它遇到与 1) 相同的问题,因为 QAssociativeIterable 不返回对其项目的引用,因此如果不首先复制每个 QVariant 就无法下降到结构中。基本上它允许在 QVariantMap 的单个子级别中进行非复制迭代。它可能仍然比直接使用 Qt 的 JSON 类要好,但本质上它似乎具有与 1 完全相同的限制)。

3) 将 JSON 转换为我自己的数据结构,这将允许在不复制任何值的情况下通过结构下降和修改数据。每个“级别”都将成为一个对象,其父级将拥有访问权限,从而允许对其内容进行任意深度的非复制访问。这个解决方案会受到这样一个事实的影响,即我很可能无法为每个“级别”实现几乎与 Qt/STL 容器一样高效的查找机制。但也许我可以通过使用尽可能快的 operator== 重载将子指针存储在其中来将 Qt 的容器与这种方法结合起来......

4) 将 JSON 转换为平面二维数据结构,例如:

Level1/Level2/key : value
Level1/Level2/key2 : value2
Level1/key3 : value3

这种方法在数据存储方面存在大量冗余,并且在与 JSON 的转换中可能成本很高,但可以说提供了最快的查找/修改速度,因为它不需要下降到任何数据结构。然而,这种好处的成本对我来说似乎太大了(冗余和缓慢的转换)。

我有点倾向于选项 3,但也许还有其他选项。我想听听您对这个问题的想法和/或想法。或者,也许 JSON 一开始就不是通过网络传输数据的正确工具。

最佳答案

如果you look at the Qt source code你会意识到 Qt json 对象已经被优化了:

  • 引用计数
  • 写入时复制。
  • 基本内存池机制。和动态数组一样,内存容量大于实际内存大小。
  • 数据的连续内存

要遍历结构,请使用 QJsonObject 类。

的开销
QJsonValue QJsonObject::value(const QString & key);

对于对象类型来说是最小的。但是正如您所指出的,它为字符串类型创建了一个新字符串;它还对数值执行“转换”。请注意,在解析进一步处理之后\内存开销仅在您开始处理 QJsonValue 时才会出现。

因此选项 1 并没有那么糟糕。考虑到您的条件,选项 2 简直太可怕了。我没有看到任何优势。由于您自己指定的原因,选项 4 是噩梦般的。那种在取得一些进步后立即后悔的工作。

如果严格使用 Qt json 类还不够,那就转向更高效的库,如 rapidjson .

优点:

  • Json 只是一个大的字符数组,元素只是引用 + 类型。
  • 字符串管理:getstring返回json字符串中字符串的指针。零分配。当您插入字符串时,您可以使用仅引用现有数据缓冲区的版本,或者您可以像 Qt 那样分配字符串。
  • 完全控制分配。 对象分配是一个移动操作。除非您明确要求复制,否则保证不会有任何内存分配\移动。分配内存的方法有一个明确的文档分配器作为参数。
  • 由于移动设计,引用计数器为零。
  • 明确评估 Json 值。

不方便

  • 非直观的代码风格。仅限成人。
  • 更容易插入缺陷和错误代码。

它做了您的选项 3 试图做的事情。

关于c++ - 在 Qt 中迭代和修改 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32543175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com