解析复杂的json数组嵌套

43 篇文章 1 订阅
8 篇文章 0 订阅
[

{

"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

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

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值