先了解概念
使用 {...}
可以叫做一个 json 对像, 使用 QJsonObject
这个类来处理
使用 [...]
可以叫做一个 json 数组, 使用 QJsonArray
这个类来处理
QJsonDocument
保存 / 初始化 json 对像, QJsonValue
保存 json 项目值
解析 json
假如有以下 QByteArray
字符串jsonstring
, 内容如下
{
"cmd": "sourceInfo",
"inport": 5,
"source": [
{
"id": 1000,
"alias": "PC1_1080P",
"url": "rtsp://192.168.10.183:8554/main",
"username": "NULL",
"password": "NULL",
"codeInfo": "h264",
"status": "online",
"encode": "h264"
},
{
"id": 1001,
"alias": "PC1_4K",
"url": "rtsp://192.168.10.183:8555/4K",
"username": "NULL",
"password": "NULL",
"codeInfo": "h264",
"status": "online",
"encode": "h265"
}
]
}
表示此 json 数据里有 cmd inport source 三个项目, 其中 source 还是一个数组, 这个数组中包含两个 json 对像
获取相对应的值
首先我们将这个字符串转换为 json 对像
QJsonParseError error;
QJsonDocument json = QJsonDocument::fromJson(jsonstring.toUtf8(), &error);
if (error.error == QJsonParseError::NoError)
{if (json.isObject()) // 是否是一个 json 对像, 即 {...}
{QJsonObject jsonObject = json.object(); // 使用 value("cmd").toString() 来获取值
qDebug() << jsonObject.value("cmd").toString(); // 将会得到 "sourceInfo"}
}
else
{qDebug() << error.errorString().toUtf8().constData();}
获取数组中的值
//QJsonDocument json = QJsonDocument::fromJson(jsonstring.toUtf8(), &error); // 接上面的代码
//QJsonObject jsonObject = json.object();
uint32_t port = jsonObject.value("inport").toInt();// 获取到 inport 的值
QJsonValue value = jsonObject.value("source");// 获取取 source 的值
if(!value.isArray() ) {...} // 判断这个值是不是一个数组
QJsonArray array = value.toArray(); // 使用 QJsonArray 来保存这个数组
for (int i = 0; i < array.size(); ++i)
{QJsonObject sourceJson = array.at(i).toObject(); // 数组里每个值都是一个 json 对像
int xxx = sourceJson.value("id").toInt(); // 取对像中的值}
生成 JSON
简单应用
QJsonObject json;
json.insert("cmd", "getSourceInfo");
json.insert("id", 0);
QJsonDocument doc(json);
conn->sendStr(doc.toJson() );
带有数组的, 并保存到文件
QJsonArray array;
QJsonObject json;
QByteArray data;
QFile file;
foreach (sessions_t *i, sessionsList)
{
QJsonObject tmpObj;
tmpObj.insert("ssid", (int)i->ssid);
tmpObj.insert("inport", (int)i->inport);
tmpObj.insert("url", i->url);
tmpObj.insert("x", i->x);
tmpObj.insert("y", i->y);
tmpObj.insert("w", i->w);
tmpObj.insert("h", i->h);
tmpObj.insert("alias", i->alias);
tmpObj.insert("enable", i->enable);
array.insert(0,tmpObj);
}
json.insert("sessions", array);
QJsonDocument doc(json);
data = doc.toJson();
file.setFileName(SESSION_FILE);
file.open(QIODevice::WriteOnly | QIODevice::Text);
file.write(data.constData() );
file.close();
正文完