[
{
"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对象,json对象中包含数组的问题。(解析具体某个值可以在根据QJsonObject相关操作函数如find,value等)
单纯的json解析也是支持的。
parse json.
obj= QJsonObject({"netCfg":[1,1,1,1,1,1,1,1]})
GetoneArraysize= 8
GetoneObject isArray: 1
记录一下 有误的地方恳请指正。