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
:
QVariantMap
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会在那个地方放一条评论,提醒你修改它。