梁上的花火 2021-09-03 12:18 采纳率: 0%
浏览 71

Qt——多级嵌套结构json在目标位置添加新的键/值失败

问题现象描述: **
最近在工作中,用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);
    }
}


  • 写回答

1条回答 默认 最新

  • 关注

    json返回的是一个数组,只能通过数组的下标循环判断值是否为C1,D1等内容,再做插入操作。

    评论

报告相同问题?

问题事件

  • 修改了问题 9月3日
  • 创建了问题 9月3日

悬赏问题

  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥15 pyqt信号槽连接写法
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注