我目前正在使用带有核心 QJson 库的 Qt5.0 来处理我正在开发的程序的一些数据。
为了设置这个问题的场景,我将为您提供一些 JSON 数据来说明我的问题:
{
"CLOCKS": [
{
"ID": "clk",
"MAX": 2e+08,
"MIN": 1e+07,
"VALUE": "no_clock"
},
{
"ID": "memclk",
"MAX": 2e+08,
"MIN": 1e+07,
"VALUE": "memclk"
}
]
}
这里我们有一个父 QJsonObject 包含一个键'CLOCKS'。此键的值是 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 之一的“值”:
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 对象层次结构中的单个值,而无需付出所有这些努力!!!