Qt5 中包含了处理 JSON 的类,包含QJsonDocument、QJsonArray、QJsonObject),这些类在 QCore 模块中,不需要引入其它模块。
JSON基本语法规则:
JSON 语法是 JavaScript 对象表示语法的子集。
- 数据在名称/值对中
- 数据由逗号分隔
- 大括号保存对象
- 中括号保存数组
- JSON 数据的书写格式是:名称/值对。
(客户端)待解析的Json包如下:
{
"HistoryData": {
"position": {
"Power": "1",
"module": "1"
},
"during": {
"startTime": "2017 - 01 - 02",
"endTime": "2017 - 02 - 03"
}
}
}
解析的时候只要想清楚什么对象下面又包含什么对象,这样代码写起来就清晰了。
本代码只是针对多级对象的情况,不包含数组,解析代码如下:
void CClient::processTextMessage(QString message) //我代码中的槽函数,接收客户端发过来的json
{
if (message == "@heart")
{
return;
}
QString Cmd(message);
QByteArray RequestCmd = Cmd.toLatin1();
QJsonParseError jsonError;
QJsonDocument DoucmentRequestCmd = QJsonDocument::fromJson(RequestCmd,&jsonError);
if (!DoucmentRequestCmd.isNull() && (jsonError.error == QJsonParseError::NoError))
{
if(DoucmentRequestCmd.isObject()) //判断第一级对象是否存在
{
QJsonObject object = DoucmentRequestCmd.object();
if(object.contains("HistoryData")) //第一级对象
{
QJsonValue value = object.value("HistoryData");
QList<QString> PowerStateList = CmdParse(value);
for(int i = 0; i < PowerStateList.size(); i++)
{
qDebug()<< PowerStateList.at(i); //输出解析好的json数据
}
}
}
}
}
QList<QString> CClient::CmdParse(QJsonValue value) //第二级对象解析函数
{
QList<QString>list; //容器保存json值
if (value.isObject()) //判断第二级对象是否存在
{
QJsonObject obj = value.toObject();
if (obj.contains("position"))
{
QJsonValue value = obj.value("position");
if (value.isObject()) //判读第三级对象是否存在
{
QJsonObject obj = value.toObject();
if(obj.contains("Power"))
{
QJsonValue value = obj.value("Power");
if(value.isString())
list.append(value.toString());
}
if(obj.contains("module"))
{
QJsonValue value = obj.value("module");
if(value.isString())
list.append(value.toString());
}
}
}
if(obj.contains("during")) //与postion对象同为第二级对象
{
QJsonValue value = obj.value("during");
if(value.isObject())
{
QJsonObject obj = value.toObject();
if(obj.contains("startTime"))
{
QJsonValue value = obj.value("startTime");
if(value.isString())
list.append(value.toString());
}
if(obj.contains("endTime"))
{
QJsonValue value = obj.value("endTime");
if(value.isString())
list.append(value.toString());
}
}
}
}
return list; //返回解析好的json值
}
解析结果如下: