我目前正在使用Qt5.0和核心QJson库来处理我正在开发的程序的一些数据。
为了解释我的问题,我将提供一些JSON数据:
{
"CLOCKS": [
{
"ID": "clk",
"MAX": 2e+08,
"MIN": 1e+07,
"VALUE": "no_clock"
},
{
"ID": "memclk",
"MAX": 2e+08,
"MIN": 1e+07,
"VALUE": "memclk"
}
]
}
这里有一个包含单个键“CLOCKS”的父级QJsonObject。该键的值是一个包含许多键/值对且包含我的数据的QJsonObjects数组。
如果我想要检索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引用,以便修改所需的时钟数据对象中的键值对。问题表现出来,我认为是因为可以获得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对象层次结构中的单个值!