解析复杂的json数组嵌套

[

{

"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="<

如果要查询一个 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:"<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=" <textEdit_2->append(array.at(i).toVariant().toByteArray());
        }
    }
}

最后调用测试

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

解析复杂的json数组嵌套_第1张图片

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

解析复杂的json数组嵌套_第2张图片 

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

parse json.

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

GetoneArraysize= 8

GetoneObject isArray: 1

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

你可能感兴趣的:(c++,QT,笔记,c++)