首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未从QJsonObject正确检索QJsonArrays

未从QJsonObject正确检索QJsonArrays
EN

Stack Overflow用户
提问于 2020-05-09 17:24:52
回答 1查看 62关注 0票数 0

在我目前工作的项目中,我使用Qt的JSON功能来存储图的状态,其中系统的每个组件递归地调用其成员的toJson-functions进行序列化。这很好用,但是我在反序列化JSON文件时遇到了一个奇怪的问题。

作为说明问题的测试,我创建了以下示例代码:

代码语言:javascript
复制
#include <QtCore/QJsonArray>
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonObject>
#include <QtDebug>

int main() {
  auto document{QJsonDocument::fromJson("{\n"
                                        "  \"o1\" : {\n"
                                        "    \"i1\" : [\"l1\", \"l2\", \"l3\"],\n"
                                        "    \"i2\": 3.14\n"
                                        "  },\n"
                                        "  \"o2\" : {\n"
                                        "    \"i2\": 2.718,\n"
                                        "    \"i1\" : [\"l1\", \"l2\", \"l3\"]\n"
                                        "  }\n"
                                        "}")};
  qDebug() << "is the document an object:" << document.isObject();
  auto document_object{document.object()};

  auto object_1_value{document_object.value("o1")};
  qDebug() << "is o1 an object:" << object_1_value.isObject();
  auto object_1{object_1_value.toObject()};

  auto inner_1_value{object_1.value("i1")};
  qDebug() << "is i1 an array:" << inner_1_value.isArray();
  auto inner_1{inner_1_value.toArray()};
  qDebug() << "i1:" << inner_1;

  auto inner_1_inner_value{inner_1.at(0)};
  qDebug() << "is i1[0] an array:" << inner_1_inner_value.isArray();
  auto inner_1_inner{inner_1_inner_value.toArray()};
  qDebug() << "i1[0]:" << inner_1_inner;

  return 0;
}

在这里,我首先查询o1,然后尝试获取存储在i1下的数组。但是,我得到了以下输出:

代码语言:javascript
复制
is the document an object: true
is o1 an object: true
is i1 an array: true
i1: QJsonArray([["l1","l2","l3"]])
is i1[0] an array: true
i1[0]: QJsonArray([["l1","l2","l3"]])

Qt似乎将返回的数组存储到一个无用的单元素数组中;在我的另一段代码中,at(0)解决了这个问题,但在这里即使这样也不起作用。

如果有人能帮我找到一个用Qt可靠地(最好是无缝地)读取嵌套JSON数组的解决方案,我将非常高兴,因为我真的不理解这个问题。我使用的是Linux 5.6.11,带有gcc 9.3.0和Qt 5.14.2。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-09 18:15:38

您的问题是大括号初始化。相反,当您执行赋值样式的初始化时,它会正常工作。

代码语言:javascript
复制
// instead of
auto inner_1{inner_1_value.toArray()};
// use
auto inner_1 = inner_1_value.toArray();
// same for all other brace inits

我认为发生的是通过std::initializer_list构造函数在花括号初始化和列表初始化之间的经典冲突,在本例中是这样的:

代码语言:javascript
复制
QJsonArray::QJsonArray(std::initializer_list<QJsonValue> args);

你想用括号初始化一个QJsonArray,但是std::initializer_list优先,你实际实例化的是一个带有一项的QJsonArray,这也是一个QJsonArray

您经常会看到使用std::vector<int>和两个冲突的ctor解释此问题:

代码语言:javascript
复制
vector(size_type count);
vector(std::initializer_list<int> init);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61694458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档