C++ 如何在Qt中合并两个QJSONObject?

C++ 如何在Qt中合并两个QJSONObject?,c++,qt,qt5,qjsonobject,C++,Qt,Qt5,Qjsonobject,我有: 我需要: QJsonObject obj1({"bla" : "lab"}) QJsonObject obj2({"bla2" : "lab2"}) { "bla" : "lab" } { "bla2" : "lab2" } 或者在JSON中: QJsonObject obj3({"bla"

我有:

我需要:

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

{
    "bla2" : "lab2"
}
或者在JSON中:

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

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

{
    "bla2" : "lab2"
}

如何实现这一点?

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

{
    "bla" : "lab",
    "bla2" : "lab2"
}
QJsonObject obj3(obj1);
for (auto it = obj2.constBegin(); it != obj2.constEnd(); it++) {
    obj3.insert(it.key(), it.value());
}
qjsonobjectobj1({{“bla1”,“lab1”});
QJsonObject对象J2({{“bla2”,“lab2”});
qjsonobjectobj34({“bla3”,“lab3”},{“bla4”,“lab4”});
QJsonObject结果;
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()解决方案
我更喜欢避免显式循环,因此我的解决方案是使用到和来自的转换,即QMap

  • 用于将所有JSON对象转换为
    QVariantMap

  • 用于将所有地图插入到一个地图中

  • 用于将生成的映射转换回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();
        }
    }
    
    {
       "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:

    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();
        }
    }
    
    {
       "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"
       }
    }
    

    是否需要递归合并?您是否尝试过在单个对象上循环并将键值对插入到
    obj3
    ?我使用了您提出的解决方案,它适合我的情况。唯一的问题是由于某种原因我无法使用
    insert
    ,所以我使用了
    map.unite(json2.toVariantMap())
    @dosvarog,您没有指定Qt版本。
    insert
    是在Qt 5.15中引入的。另一方面,
    unite
    是过时的。无论如何,我很乐意提供帮助。您是对的。我总是忘记Qt经常更改。我的版本是5.12。@dosvarog,只要它对您有效,我想它是可以的。它可能是一个好的id如果你升级到5.15或更高版本,ea会在那个地方放一条评论,提醒你修改它。