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

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日

悬赏问题

  • ¥20 Keil编译时报错"no source": Error: #5: cannot open source
  • ¥50 操作系统时间无法更新
  • ¥20 Windows11, usb转hdmi,外接显示器无反应
  • ¥20 怎么在JavaFx的TableView中动态地添加数据。
  • ¥15 MFC里的工具栏按钮图标使用外部图片
  • ¥15 如何在 llama.cpp 服务器中实现用户登录功能的优化方案?(语言-c++)
  • ¥15 有会用octave 的吗,急!代做!好偿!
  • ¥15 有一套同城小程序源码,Uniapp前端,php+html+mysql后端 ,能不能教我搭建起来可以运行,我不知道怎样操作
  • ¥15 mac调用java.io接口无法在根目录生成文件
  • ¥15 java微服务节点假死,网关路由时长延迟