Qt5 解析多级JSON 包


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 PowerStateList = CmdParse(value);
                for(int i = 0; i < PowerStateList.size(); i++)
                {
                    qDebug()<< PowerStateList.at(i);  //输出解析好的json数据
                }
            }
        }
    }
}

QList CClient::CmdParse(QJsonValue value)  //第二级对象解析函数
{
    QListlist;  //容器保存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值
}

Qt5 解析多级JSON 包_第1张图片

解析结果如下:

Qt5 解析多级JSON 包_第2张图片


你可能感兴趣的:(嵌入式Linux,ARM开发)