首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Qt中合并两个QJsonObjects?

如何在Qt中合并两个QJsonObjects?
EN

Stack Overflow用户
提问于 2020-11-03 15:16:01
回答 4查看 1.4K关注 0票数 2

我有:

代码语言:javascript
运行
复制
QJsonObject obj1({"bla" : "lab"})
QJsonObject obj2({"bla2" : "lab2"})

我需要:

代码语言:javascript
运行
复制
QJsonObject obj3({"bla" : "lab", "bla2" : "lab2"})

或者在JSON中:

代码语言:javascript
运行
复制
{
    "bla" : "lab"
}

{
    "bla2" : "lab2"
}

我需要:

代码语言:javascript
运行
复制
{
    "bla" : "lab",
    "bla2" : "lab2"
}

如何做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-11-03 16:20:35

解决方案

我更喜欢避免显式循环,所以我的解决方案是使用与QVariantMap (又名QMap<QString, QVariant> )的转换。

  1. 使用QJsonObject::toVariantMap将所有JSON对象转换为QVariantMap
  2. 使用QMap::insert将所有映射插入到一个
  3. 使用QJsonObject::fromVariantMap将结果映射转换回JSON对象

备注:如果所有JSON对象都包含唯一的键,则建议的解决方案最好是,因为文档声明:

如果map包含具有相同键的多个条目,则该键的最终值未定义。

示例

下面是我为您准备的一个简单示例,演示如何实现提议的解决方案:

代码语言:javascript
运行
复制
QJsonObject json1{{"foo_key", "foo_value"}};
QJsonObject json2{{"moo_key", "moo_value"}, {"boo_key", "boo_value"}};
QVariantMap map = json1.toVariantMap();

map.insert(json2.toVariantMap());

qDebug() << QJsonObject::fromVariantMap(map);

结果

此示例产生以下结果:

代码语言:javascript
运行
复制
QJsonObject({"boo_key":"boo_value","foo_key":"foo_value","moo_key":"moo_value"})
票数 2
EN

Stack Overflow用户

发布于 2020-11-03 15:28:08

代码语言:javascript
运行
复制
QJsonObject obj3(obj1);
for (auto it = obj2.constBegin(); it != obj2.constEnd(); it++) {
    obj3.insert(it.key(), it.value());
}
票数 4
EN

Stack Overflow用户

发布于 2021-03-15 22:44:13

扩展版本,它还合并同名的对象并添加数组元素(如果在两个对象中都有相同的名称):

代码语言:javascript
运行
复制
void mergeJson(QJsonObject& src, const QJsonObject& other)
{
    for(auto it = other.constBegin(); it != other.constEnd(); ++it)
    {
        if(src.contains(it.key()))
        {
            if(src.value(it.key()).isObject() && other.value(it.key()).isObject())
            {
                QJsonObject one(src.value(it.key()).toObject());
                QJsonObject two(other.value(it.key()).toObject());

                mergeJson(one, two);
                src[it.key()] = one;
            }
            else if(src.value(it.key()).isArray() && other.value(it.key()).isArray())
            {
                QJsonArray arr = other.value(it.key()).toArray();
                QJsonArray srcArr = src.value(it.key()).toArray();
                for(int i = 0; i < arr.size(); i++)
                    srcArr.append(arr[i]);
                src[it.key()] = srcArr;
            }
        }
        else
            src[it.key()] = it.value();
    }
}

如果srcother有一个名称相同的字段(除了数组和对象,请参见顶部),则将使用src。

src:

代码语言:javascript
运行
复制
{
   "arr":[
      {
         "fieldOne":"dqwd",
         "fieldTwo":"dqwd2"
      },
      {
         "fieldOne":"dqwd",
         "fieldTwo":"dqwd2"
      },
      {
         "fieldOne":"dqwd",
         "fieldTwo":"dqwd2"
      }
   ],
   "fieldOne":"dqwd",
   "fieldTwo":"dqwd2",
   "two":{
      "fieldOne":"dwqwfw",
      "fieldTwo":"grew",
      "fregtegergwedffe":{
         "sdqqwd":"wdqfrg"
      }
   }
}

其他:

代码语言:javascript
运行
复制
{
   "arr":[
      {
         "fieldOne":"dwqwfw",
         "fieldTwo":"kjhgf",
         "qwdqwd":"grew"
      }
   ],
   "fieldOne":"rfgwef",
   "grege":"gfewrfew",
   "grwefege":"fewfgrew",
   "two":{
      "fieldOne":"dwqwfw",
      "fieldTwo":"kjhgf",
      "qwdqwd":"grew"
   }
}

调用后合并/src:

代码语言:javascript
运行
复制
{
   "arr":[
      {
         "fieldOne":"dqwd",
         "fieldTwo":"dqwd2"
      },
      {
         "fieldOne":"dqwd",
         "fieldTwo":"dqwd2"
      },
      {
         "fieldOne":"dqwd",
         "fieldTwo":"dqwd2"
      },
      {
         "fieldOne":"dwqwfw",
         "fieldTwo":"kjhgf",
         "qwdqwd":"grew"
      }
   ],
   "fieldOne":"dqwd",
   "fieldTwo":"dqwd2",
   "grege":"gfewrfew",
   "grwefege":"fewfgrew",
   "two":{
      "fieldOne":"dwqwfw",
      "fieldTwo":"grew",
      "fregtegergwedffe":{
         "sdqqwd":"wdqfrg"
      },
      "qwdqwd":"grew"
   }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64665582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档