解析复杂的json数组嵌套

2023-11-02

[

{

"chanNameList": [

{

"channelName": "通道1",

"enable": 1,

"perX": 0,

"perY": 0,

"rgbaBG": "#00000000",

"rgbaFont": "#00000000"

}

],

"channel": 1,

"ip": "192.168.121.13",

"status": 1,

"streamInfo": [

{

"IFrameInterval": 50,

"aBitrate": 64,

"aSamplerate": 8,

"acodes": "G711A",

"bitrateTypes": "VBR",

"bitstream": 1,

"eventRate": 0,

"eventResolution": "Invalid",

"eventStream": 0,

"profilecaps": "Main",

"resolution": "1920x1080P",

"streamTypes": 3,

"vBitrate": 3072,

"vFrameRate": 30,

"vcodes": "H264"

},

{

"IFrameInterval": 50,

"aBitrate": 64,

"aSamplerate": 8,

"acodes": "G711A",

"bitrateTypes": "VBR",

"bitstream": 2,

"eventRate": 0,

"eventResolution": "Invalid",

"eventStream": 0,

"profilecaps": "Main",

"resolution": "704x576",

"streamTypes": 3,

"vBitrate": 1024,

"vFrameRate": 25,

"vcodes": "H264"

}

],

"type": "D"

}

]

如解析以上复杂的嵌套数据。主要使用到QT中的QJson操作json文件的四个类(QJsonDocument、QJsonArray、QJsonObject,QJsonParseError,QJsonValue)

类名 作用
QJsonArray 封装 JSON 数组
QJsonDocument 读写 JSON 文档
QJsonObject 封装 JSON 对象
QJsonObject::iterator 用于遍历QJsonObject的 STL 风格的非 const 遍历器
QJsonParseError 报告 JSON 处理过程中出现的错误
QJsonValue 封装 JSON 值

首先可以使用 QJsonDocument::fromJson() 从基于文本的表示转化为 QJsonDocument, toJson() 则可以反向转化为文本。

int MainWindow::JsonParseValue()
{
    QByteArray data = ui->textEdit->toPlainText().toUtf8();
    QJsonParseError json_error;
    QJsonDocument doucment = QJsonDocument::fromJson(data, &json_error);
    //判断jsonDoc是否为空并是否转换成功
    if (!doucment.isNull()&&json_error.error == QJsonParseError::NoError) {
        //再判断是否为json数组
        if (doucment.isArray())
        {
            QJsonArray array = doucment.array();  // 转数组
            GetoneArray(array);
        }
        //如果直接是json对象则直接读取数据
        else if (doucment.isObject()) {
            //构建json对象
            const QJsonObject obj = doucment.object();
            qDebug()<<"obj="<<obj;
            GetoneObject(obj);
        }
        else {
           QMessageBox::information(this,"error","数据格式错误");
           goto JSEXIT;
        }
    }else{
        qDebug()<<"json error:"<<json_error.errorString();
        goto JSEXIT;
    }
    return 0;
JSEXIT:
    return -1;
}

如果要查询一个 JSON 文档是否包含一个数组或一个对象,使用 isArray() 和 isObject()。包含在文档中的数组或对象可以使用 array() 或 object() 检索,然后读取或操作。

在解析过程中,先判断 QJsonValue 是否为对应的类型如 isObject(),再通过 toObject() 转化,如果是Array则可以通过toArray()转换。

//获取该通道json对象嵌套的json
void MainWindow::GetoneObject(QJsonObject obj)
{
     QStringList strList = obj.keys();
     for (int i = 0; i < obj.size(); i++)
     {
         QJsonValue val = obj.value(strList.at(i));
         //当value值也是一个json对象时
         if (val.isObject())
         {
             GetoneObject(val.toObject());
             qDebug()<<"GetoneObject object:"<<i+1;
         }
         else if(val.isArray()){
             GetoneArray(val.toArray());
             qDebug()<<"GetoneObject isArray:"<<i+1;
             qDebug()<<"GetoneObject isArray data:"<<val.toVariant().toByteArray();
         }
         else{
             //json对象中是值
             ui->textEdit_2->append(strList.at(i));
             ui->textEdit_2->append(val.toVariant().toByteArray());
         }
     }
}
//获取该通道json对象中嵌套的数组
void MainWindow::GetoneArray(QJsonArray array)
{
    int nSize = array.size();
    qDebug() << "GetoneArraysize=" <<nSize;
    for (int i = 0; i < nSize; ++i)
    {
        if(array.at(i).isObject())
        {
            const QJsonObject obj = array.at(i).toObject();
            qDebug()<<"GetoneArray object:"<<i+1;
            GetoneObject(obj);
        }
        else if(array.at(i).isArray()){
            GetoneArray(array.at(i).toArray());
            qDebug()<<"GetoneArray array:"<<i+1;
        }
        else {
            //数组中是值
            ui->textEdit_2->append(array.at(i).toVariant().toByteArray());
        }
    }
}

最后调用测试

    int ret = JsonParseValue();
    if(ret == 0){
        ui->ResultLed->setText("完成");
    }
    else {
        ui->ResultLed->setText("出错");
    }

很好的解决了数组中包含json对象,json对象中包含数组的问题。(解析具体某个值可以在根据QJsonObject相关操作函数如find,value等)

 

单纯的json解析也是支持的。

parse json.

obj= QJsonObject({"netCfg":[1,1,1,1,1,1,1,1]})

GetoneArraysize= 8

GetoneObject isArray: 1

 记录一下  有误的地方恳请指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析复杂的json数组嵌套 的相关文章

随机推荐

  • theos linux环境,MAC OS X下的Linux环境

    关键字 HomeBrew 好比Windows下的Cygwin 安装Homebrew 该si胜过macport ruby e curl fsSL https raw githubusercontent com Homebrew install
  • 【知识分享】C语言应用-易错篇

    一 C语言简介 C语言结构简洁 具有高效性和可移植性 因此被广泛应用 但究其历史的标准定义 C语言为了兼容性在使用便利性作出很大牺牲 在 C陷阱与缺陷 一书中 整理出大部分应用过程中容易出错的点 本文为 C陷阱与缺陷 的浓缩版本 想要更详细
  • 009 5道例题讲解函数递归——“C”

    函数递归是什么 程序调用自身的编程技巧称为递归 recursion 递归做为一种算法在程序设计语言中广泛应用 一个过程或函数在其定义或说明中有直接或间接 调用自身的一种方法 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问
  • Leetcode2486-追加字符以获得子序列

    双指针遍历即可 class Solution public int appendCharacters string s string t int n s size m t size int l 0 r 0 while l
  • 连接游戏服务器网络延迟高,网络延迟_连wifi玩游戏网络延迟高-太平洋IT百科

    网络延迟是游戏玩家最不能忍的 为了解决网络延迟的问题 玩家们装了光纤 换了路由 然而 为你我用了半年的积蓄 玩个农药还跳ping 开局两分钟 延迟400ms 网络延迟在王者荣耀中卡得连鲁班七号都表示 我想静静 连WIFI玩游戏网络延迟高怎么
  • 为什么动态库不能被其他动态或静态库包含

    如果静态库包含了动态库 则动态库失去了它的意思 因为动态库是在运行时调用的 如果包含在静态库里 意味着在编译时把动态库编译进去了 gcc不会做这么荒唐的事的 如果动态库包含了动态库 这也没必要 因为运行时可以直接调用了 为什么还要包含到另一
  • 腾讯云服务器搭建小皮面板phpstudy教程

    腾讯云控制台设置 找到自己服务器所在的实例 这里可以获得远程登录的账号密码 域名解析在下面添加自己ip解析到购买的域名就好了 搭建云服务器及php环境搭建教程如下 方包用的是windows server 服务器 适合新手 不像linux那样
  • GDI+ 中路径渐变画刷的使用

    背景 路径是一系列相互连接的直线和曲线 由许多不同类型的点所构成 用于表示复杂的不规则图形 GraphicsPath 类表示 路径渐变画刷允许设置颜色从中心向边界渐变的画刷 可以设置中心点颜色和边界点的颜色 构建路径渐变画刷 使用路径构建
  • Linux命令集锦-持续更新

    centos版本 CentOS Linux release 7 6 1810 Core 一 查看端口占用 lsof Linux安装 sudo yum install lsof Mac安装 brew install lsof lsof i p
  • 2020年排名前10的前端框架

    Ant Design 网站链接 https ant design index cn 蚂蚁金服出品 非常著名的框架 就算你不了解前端 也会在公司的项目中多少听到程序员说起过 目前很多公司都在用 已经很成熟 而且提供了对设计师友好的 Sketc
  • tensorflow目标检测api使用过程中的问题

    tensorflow目标检测api使用过程中的问题 使用环境 win10 pycharm开发平台 所有的依赖包都是用pip安装的 按照官方要求把api的依赖库装完之后在测试的时候提示no module named object detect
  • xshell卸载不干净导致无法安装

    卸载xshell 删除两个地方的注册表 Windows 文件夹下 C Program Files x86 InstallShield Installation Information 这个目录下 删了这个文件夹 F3FDFD5A A201
  • 【译】Hard Forks, Soft Forks, Defaults and Coercion

    区块链领域的一个重要论据是硬叉或软叉是否是首选的协议升级机制 两者之间的基本区别在于 软叉通过严格减少有效的交易集来改变协议的规则 所以遵循旧规则的节点仍然会进入新链 假设大多数矿工 验证者实施叉 而硬叉允许以前无效的交易和块变得有效 所以
  • centos7部署tomcat

    1 下载tomcat和jdk的tar gz包 并放在 root目录下 链接 https pan baidu com s 1fsJh8f6 rQxFzA5SIzUSfw 提取码 6zmg 2 解压文件 tar xf apache tomcat
  • [PCIe]LTSSM与电源管理

    1 LTSSM LTSSM全称是Link Training and Status State Machine 有以下11个状态 Detect Polling Configuration Recovery L0 L0s L1 L2 Hot R
  • 【cfeng work】什么是云原生 Cloud Native

    WorkProj 内容管理 云原生 云原生应用 十二要素应用 cfeng的work理解 本文introduce 云原生 Cloud Native相关内容 随着技术的迭代 从最初的物理机 gt 虚拟机 从单机 gt 分布式微服务 现在的热门概
  • C语言自定义函数求和

    include
  • vi笔记2——vi之简单编辑

    vi笔记2 vi之简单编辑 vi 简单编辑主要包含以下内容 Moving the cursor Adding and changing text Deleting moving and copying text More ways to e
  • 华三H3C交换机如何配置堆叠irf虚拟化(未配置检测机制)

    华三交换机如何配置堆叠irf IRF Intelligent Resilient Framework 智能弹性架构 是华三的软件虚拟化技术 将一台以上的交换机组合起来共同工作 能提供尽可能多的端口 多台交换机经过配置后可看成为一个虚拟的一体
  • 解析复杂的json数组嵌套

    chanNameList channelName 通道1 enable 1 perX 0 perY 0 rgbaBG 00000000 rgbaFont 00000000 channel 1 ip 192 168 121 13 status