QJsonObject::insert相对于直接赋值给QJsonValueRef有什么区别?

5

我现在一直在Qt中使用JSON,并一直按照示例中所示进行操作。不过,我想知道直接将值分配给QJsonValueRef与在向QJsonObject添加项时使用QJsonObject::insert是否有区别,也就是说这两行代码:

  • json["name"] = mName;
  • json.insert("name", mName);

有什么不同之处,还是只是编程风格的问题?


2
如果它与std::map类似,那么调用insert不会替换现有键值对的值,而使用索引运算符则会。 - Captain Obvlious
@Captain Obvlious 嗯,QJsonObject::insert的文档(http://doc.qt.io/qt-5/qjsonobject.html#insert)说它会:“如果已经有一个键为key的项,则该项的值将被替换为value。” - scopchanov
当然,感谢您的快速回复! - scopchanov
1个回答

3
在概念上,它是不同的。 operator[](const QString &key) 返回指向 key 所指向的 JSON value 的引用(即不包括 key),而 insert 方法将添加/替换值,然后返回一个指向该值的 iterator(即我们可以通过迭代器访问 keyvalue)。因此,使用 operator[] 只能访问特定值的引用,而使用 insert 则可以获得一个可用于访问 JSON 对象中元素(键、值)本身及其前/后(如果有)元素的 iterator
从技术上讲,在 operator[](const QString &key) 中,根据 源代码,首先会搜索由 key 指向的值,如果存在,则返回 引用。如果该值不存在,则调用 insert 并将空的 QJSonValue() 作为第二个参数,然后返回对此新值的引用。由于您对 operator[] 的调用后面跟着值修改,因此这两个操作的效果将相同,即将 mValue 分配给具有键 "name" 的元素。

现在我明白了其中的区别。这个洞见让我对它在幕后是如何工作有了更多的了解,至少对我来说非常有帮助。谢谢! - scopchanov

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