繁体   English   中英

如何在Qt中合并两个QJsonObjects?

[英]How to merge two QJsonObjects in Qt?

我有:

QJsonObject obj1({"bla" : "lab"})
QJsonObject obj2({"bla2" : "lab2"})

我需要:

QJsonObject obj3({"bla" : "lab", "bla2" : "lab2"})

或者在 JSON 中:

{
    "bla" : "lab"
}

{
    "bla2" : "lab2"
}

我需要:

{
    "bla" : "lab",
    "bla2" : "lab2"
}

如何做到这一点?

QJsonObject obj3(obj1);
for (auto it = obj2.constBegin(); it != obj2.constEnd(); it++) {
    obj3.insert(it.key(), it.value());
}

解决方案

我倾向于避免显式循环,所以我的解决办法是使用一个皈依QVariantMap ,又名QMap<QString, QVariant>

  1. 使用QJsonObject::toVariantMap将所有 JSON 对象转换为QVariantMap

  2. 使用QMap::insert将所有地图插入一个

  3. 使用QJsonObject::fromVariantMap将结果映射转换回 JSON 对象

注意:如果所有 JSON 对象都包含唯一键,则建议的解决方案将最有效,因为文档指出:

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

例子

这是我为您准备的一个简单示例,用于演示如何实施建议的解决方案:

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);

结果

此示例产生以下结果:

QJsonObject({"boo_key":"boo_value","foo_key":"foo_value","moo_key":"moo_value"})

您可以遍历所有需要合并的 json,然后遍历它们的元素并将它们插入到新的 json 中:

  QJsonObject obj1({{"bla1", "lab1"}});
  QJsonObject obj2({{"bla2", "lab2"}});
  QJsonObject obj34({{"bla3", "lab3"}, {"bla4", "lab4"}});
  QJsonObject result;
  for (const auto& json : {obj1, obj2, obj34})
  {
    for (auto it = json.begin(); it != json.end(); it++)
    {
      result.insert(it.key(), it.value());
    }
  }
  for (auto it = result.begin(); it != result.end(); it++)
  {
    qDebug() << it.key() << ": " << it.value();
  }

不过,可能不是最有效的。

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

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。

源代码:

{
   "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"
      }
   }
}

其他:

{
   "arr":[
      {
         "fieldOne":"dwqwfw",
         "fieldTwo":"kjhgf",
         "qwdqwd":"grew"
      }
   ],
   "fieldOne":"rfgwef",
   "grege":"gfewrfew",
   "grwefege":"fewfgrew",
   "two":{
      "fieldOne":"dwqwfw",
      "fieldTwo":"kjhgf",
      "qwdqwd":"grew"
   }
}

调用后合并/src:

{
   "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"
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM