- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我目前正在使用带有核心 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 reference 进行修改而不是复制时,我最近开始遇到问题。
所以我的问题是,鉴于提供的示例数据,我如何获取 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 对象层次结构中的单个值,而无需付出所有这些努力!!!
最佳答案
在浪费了我生命中的三个小时之后,我可以确认,截至今天,这对于 Qt 5.4 来说仍然是不可能的。您可以修改 JSON 对象,但不能修改嵌套的 JSON 对象。
问题在于代码如:
json["aa"].toObject()["bb"] = 123;
基本意思如下:
QJsonObject temp = json["aa"].toObject();
temp["bb"] = 123;
并且由于 temp
不是引用而是对象(并且 toObject()
不返回引用),分配被编译但随后被丢弃。
基本上它分解为不可能获得对您刚刚创建的对象的引用的事实,这意味着您不能从左到右创建它们,即 aa["bb"] -> aa["bb"] ["cc"] 等 - 您无法获得对 aa["bb"] 的引用,只能获得其值的拷贝。
尽管如此,可以使用添加的新值重新创建 JSON,如下所述:https://forum.qt.io/topic/25096/modify-nested-qjsonvalue/4 - 请注意,这会在每次调用时不断重新创建对象,本质上是内存使用灾难,但这是 Qt 当前允许的所有内容。
关于c++ - 如何在不使用拷贝的情况下更改 QJson 层次结构中的 QJsonObject 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17034336/
一些背景 最初在 mac 上做了一个项目,现在我想使用我的 Linux 机器来做同样的项目。设置文件夹依赖: #include #include #include #include 这些未包含
现在我正在将我的项目从 Linux 移植到 Windows。 我通过 instructions 使用 QtCreator 构建了 QJson ,现在我有一个简单的问题:我应该将库 dll 文件移到哪里
我正在使用 QJson 进行解析。但我遇到了一些问题。我使用了以下代码: void CityBook ::getCityList(QUrl url) { //!connect(ci
现在我正在使用 Qt v2.3我有一个问题,我需要使用 json 将数据发送到服务器,但 Qjson 类不存在。如何将 JSON 包含到 Qt 中?或者是否有任何外部头文件? 最佳答案 您可能指的是
我目前正在使用带有核心 QJson 库的 Qt5.0 来处理我正在开发的程序的一些数据。 为了解决这个问题,我将为您提供一些 JSON 数据来说明我的问题: { "CLOCKS": [
如何从一个 qt 项目中引用 qjson.dll 文件? 例如 :C:\qjson-0.7.1\qjson\build\lib ,在这个位置,我有 qjson.dll 和 qjson.dll.a 文件
使用QSettings保存UI设置既麻烦又容易出错,因为每次你都必须使用setValue()和value()函数,而且定义组、应用程序名称和组织,这些在大型应用程序中可能会出现错误: QSetting
我已经按照存档中的说明成功(?)安装了 QJson 库。但是编译器给我这个错误: Undefined reference to QJSon::Parser::Parser(). 我找到了安装库文件的位
当我尝试运行从该链接下载的 Qt 项目时出现此错误 https://code.google.com/p/qml-google-maps/downloads/list 我正在尝试在 Qt 5.0.2 中
我是一名优秀的程序员,十分优秀!