问题现象描述: **
最近在工作中,用Qt编写一个有关服务器通信,接收log的程序。需要解析服务发来的json串send_json,根据send_json构建一个结构较为复杂的json串rev_json。由于服务器的log是源源不断的发送的,我必须不断在rev_json中找到新数据需要插入的位置,在此位置插入新数据,完善rev_json。
** rev_json大致结构:
{
"C1":{
"D1":{
"Tag1":[0,int]
"Tag2":[0,int]
},
"D2":{
"Tag1":[0,int]
}
},
"C2":{
"D3":{
"Tag1":[0,int]
"Tag2":[0,float]
"Tag3":[0,int]
}
}
}
我起初的思路是直接用 [ ] 来定位到目标位置,代码如:rev.json[C1][D1].insert(......) ,事实证明此方法是不可行的。
解决办法: 利用局部变量,每一层嵌套是一个局部变量,层层赋值,最外层嵌套rev_obj定义为全局变量
QJsonObject d_obj;
QJsonObject c_obj;
QJsonArray t_arr;
t_arr.append("0");
t_arr.append("int");
d_obj.insert("tag1", t_arr);
c_obj.insert("D1", d_obj);
rev_obj.insert("C1", c_obj);
下面是我的源码
//将服务器数据整理成json形式的map,该map包含关于通道和设备的一切信息
//json形式: {"C1":{"D1":{"Tag1":0,"Tag2":0},"D2":{"Tag1":0}},"C2":{"D3":{"Tag1":0,"Tag2":0,"Tag3":0}}}
QStringList channels = map_obj.keys();
if(channels.size() != 0)
{
for(int i=0; i<channels.size(); i++)
{
if(chan == channels.at(i))
{
QJsonObject chan_obj = map_obj[chan].toObject();
QStringList devices = chan_obj.keys();
for(int j=0; j<devices.size(); j++)
{
if(dev == devices.at(j))
{
QJsonObject dev_obj = chan_obj[dev].toObject();
QJsonArray tag_arr;
tag_arr.append(val);
tag_arr.append(info);
dev_obj.insert(tag, tag_arr);
chan_obj.insert(dev, dev_obj);
map_obj.insert(chan, chan_obj);
break;
}
else
{
if(j == devices.size()-1)
{
QJsonObject dev_obj;
QJsonArray tag_arr;
tag_arr.append(val);
tag_arr.append(info);
dev_obj.insert(tag, tag_arr);
chan_obj.insert(dev, dev_obj);
map_obj.insert(chan, chan_obj);
break;
}
}
}
break;
}
else
{
if(i == channels.size()-1)
{
QJsonObject dev_obj;
QJsonObject chan_obj;
QJsonArray tag_arr;
tag_arr.append(val);
tag_arr.append(info);
dev_obj.insert(tag, tag_arr);
chan_obj.insert(dev, dev_obj);
map_obj.insert(chan, chan_obj);
break;
}
}
}
}
else
{
QJsonObject dev_obj;
QJsonObject chan_obj;
QJsonArray tag_arr;
tag_arr.append(val);
tag_arr.append(info);
dev_obj.insert(tag, tag_arr);
chan_obj.insert(dev, dev_obj);
map_obj.insert(chan, chan_obj);
}
}