我正在使用Qt5.0与核心QJson库来处理我正在开发的程序的一些数据.
要为此问题设置场景,我将为您提供一些说明我的问题的JSON数据:
{ "CLOCKS": [ { "ID": "clk","MAX": 2e+08,"MIN": 1e+07,"VALUE": "no_clock" },{ "ID": "memclk","VALUE": "memclk" } ] }
这里我们有一个包含单个键“CLOCKS”的父QJsonObject.该键的值是QJsonObjects的QJsonArray,它包含一些包含我的数据的键/值对.
如果我想使用id’clk’检索QJsonObject,我目前正在使用如下代码:
// imagine m_data is my parent QJsonObject QJsonArray clocks = m_data["CLOCKS"].toArray(); foreach (const QJsonValue & value,clocks) { QJsonObject obj = value.toObject(); if (obj["ID"].toString() == "clk") { return obj; } }
这工作正常,图书馆迄今一直很棒.但是,当我想要获得一个QJsonObject引用来修改而不是一个副本时,我最近开始遇到问题.
所以我的问题是,给定示例数据提供了如何获取QJsonObject引用以修改所需时钟数据对象中的键/值对.问题表现在于IMO,因为您可以获得QJsonValueRefs,这是对值条目的引用,但实际访问此数据(如果该值是另一个数组/对象),则必须使用toArray进行转换(),toObject()函数等.这个函数只返回副本,而不是引用,创建一个屏障,用引用来迭代对象层次结构.
到目前为止,我想到的唯一方法是创建一个完整的“CLOCKS”QJsonArray的副本,找到我想要的对象,然后将其删除并重新插入更改的数据…并最终分配整个数组返回到父对象中的“CLOCKS”键.对我来说这对我来说似乎很麻烦,我觉得我在做错事,必须有更好的方法.
为了支持这里,我的代码到目前为止,只是为了更改时钟QJsonObjects的“VALUE”:
QJsonArray resets = m_data.value(TAG_RESETS).toArray(); // get a copy of the QJsonObject QJsonObject obj; foreach (const QJsonValue & value,resets) { QJsonObject o = value.toObject(); if (o.value(TAG_ID).toString() == id) { obj = o; break; } } // modify the object obj[TAG_VALUE] = "NEW VALUE"; // erase the old instance of the object for (auto it = resets.begin(); it != resets.end(); ++it) { QJsonObject obj = (*it).toObject(); if (obj.value(TAG_ID).toString() == id) { resets.erase(it); // assign the array copy which has the object deleted m_data[TAG_RESETS] = resets; break; } } // add the modified QJsonObject resets.append(obj); // replace the original array with the array containing our modified object m_data[TAG_RESETS] = resets;
我知道这可以缩短一点,但仍然似乎必须有一个更好的方法来更改QJson对象层次结构中的单个值,而不用做所有这些努力!