微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 如何在不使用副本的情况下更改QJson层次结构中的QJsonObject值?

我正在使用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对象层次结构中的单个值,而不用做所有这些努力!

解决方法

根据Qt开发人员Q Q5的实际情况,

Qt当前包含的是一个“只读”实现来提供解析功能.他有意在将来以“参考”支持来扩展设计,但还没有完成.

原文地址:https://www.jb51.cc/c/111758.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐