Qt之JSON生成與解析

本文摘自:https://blog.csdn.net/liang19890820/article/details/52767153

因爲最近在使用mqtt做數據的收發用到json,linux arm中因爲使用了cjson的第三方庫做了解析,比較簡單。

但是具體的在PC端使用的Qt進行的客戶端的編寫,而qt是自帶json的數據解析庫的,所以,需要簡單的研究下,摘過這篇博客,並做加入一點自己的筆記。

簡述

Qt5 中包含了處理 JSON 的類,均以 QJson 開頭(例如:QJsonDocument、QJsonArray、QJsonObject),在 QtCore 模塊中,不需要額外引入其它模塊。

- 常用的JSON庫

json.org 中介紹了 JSON 在各種語言中的應用,在 C/C++ 中比較常用的JSON 庫主要有以下幾個:

JsonCpp
JsonCpp 是一個 C++ 用來處理 JSON 數據的開發包。
網址:http://jsoncpp.sourceforge.net/

cJSON
cJSON 是一個超輕巧,攜帶方便,單文件,簡單的可以作爲 ANSI-C 標準的 JSON 解析器。
網址:http://sourceforge.net/projects/cjson/

QJson
QJson 是一個基於 Qt 的開發包用來將 JSON 數據解析成 QVariant 對象,JSON 的數組將被映射爲QVariantList 實例,而其他對象映射爲 QVariantMap 實例。
網址:http://qjson.sourceforge.net/

關於 Qt 中對 JSON 的生成與解析,Qt5 以前的版本,可以使用 QJson 庫,需要單獨下載、編譯,才能使用。到了 Qt5,提供了專門的 QJsonDocument 及其相關類來讀和寫 JSON 文檔。

 

//組成json對象
  QJsonObject json1;
  json1.insert("name", "111");
  json1.insert("pass", 222);
  json1.insert("flout", 33.33);
  QJsonDocument doc;
  doc.setObject(json1);
  QByteArray byte = doc.toJson(QJsonDocument::Compact);
  qDebug()<<byte;

//解析json對象
  QJsonParseError error;
  doc = QJsonDocument::fromJson(byte, &error);
  if(error.error == QJsonParseError::NoError)
  {
      if(doc.isObject())
      {
          QJsonObject obj = doc.object();
          if(obj.contains("name")){//字符串的解析
               QJsonValue value = obj.value("name");
               if(value.isString()){
                 QString strname = value.toString();
                 qDebug()<< strname;
               }
          }
          if(obj.contains("pass")){
              QJsonValue value = obj.value("pass");
              if(value.isDouble()){//整型的解析
                  int n_pass = value.toVariant().toInt();
                  qDebug()<<n_pass;
              }
          }
          if(obj.contains("flout")){
              QJsonValue value = obj.value("flout");
              if(value.isDouble()){//double的解析
                  double n_pass = value.toDouble();
                  qDebug()<<n_pass;
              }
          }
      }
  }



  QJsonArray versionArray;
  versionArray.append(4.8);
  versionArray.append(5.2);
  versionArray.append(5.7);

  // 構建 Json 對象 - Page
  QJsonObject pageObject;
  pageObject.insert("Home", "https://www.qt.io/");
  pageObject.insert("Download", "https://www.qt.io/download/");
  pageObject.insert("Developers", "https://www.qt.io/developers/");

  // 構建 Json 對象
  QJsonObject json;
  json.insert("Name", "Qt");
  json.insert("Company", "Digia");
  json.insert("From", 1991);
  json.insert("Version", QJsonValue(versionArray));
  json.insert("Page", QJsonValue(pageObject));

  // 構建 Json 文檔
  QJsonDocument document;
  document.setObject(json);
  QByteArray byteArray = document.toJson(QJsonDocument::Compact);
  QString strJson(byteArray);

  qDebug() << strJson;

  QJsonParseError jsonError;
  QJsonDocument doucment = QJsonDocument::fromJson(byteArray, &jsonError);  // 轉化爲 JSON 文檔
  if (!doucment.isNull() && (jsonError.error == QJsonParseError::NoError)) {  // 解析未發生錯誤
      if (doucment.isObject()) {  // JSON 文檔爲對象
          QJsonObject object = doucment.object();  // 轉化爲對象
          if (object.contains("Name")) {
              QJsonValue value = object.value("Name");
              if (value.isString()) {
                  QString strName = value.toString();
                  qDebug() << "Name : " << strName;
              }
          }
          if (object.contains("Company")) {
              QJsonValue value = object.value("Company");
              if (value.isString()) {
                  QString strCompany = value.toString();
                  qDebug() << "Company : " << strCompany;
              }
          }
          if (object.contains("From")) {
              QJsonValue value = object.value("From");
              if (value.isDouble()) {
                  int nFrom = value.toVariant().toInt();
                  qDebug() << "From : " << nFrom;
              }
          }
          if (object.contains("Version")) {
              QJsonValue value = object.value("Version");
              if (value.isArray()) {  // Version 的 value 是數組
                  QJsonArray array = value.toArray();
                  int nSize = array.size();
                  for (int i = 0; i < nSize; ++i) {
                      QJsonValue value = array.at(i);
                      if (value.isDouble()) {
                          double dVersion = value.toDouble();
                          qDebug() << "Version : " << dVersion;
                      }
                  }
              }
          }
          if (object.contains("Page")) {
              QJsonValue value = object.value("Page");
              if (value.isObject()) {  // Page 的 value 是對象
                  QJsonObject obj = value.toObject();
                  if (obj.contains("Home")) {
                      QJsonValue value = obj.value("Home");
                      if (value.isString()) {
                          QString strHome = value.toString();
                          qDebug() << "Home : " << strHome;
                      }
                  }
                  if (obj.contains("Download")) {
                      QJsonValue value = obj.value("Download");
                      if (value.isString()) {
                          QString strDownload = value.toString();
                          qDebug() << "Download : " << strDownload;
                      }
                  }
                  if (obj.contains("Developers")) {
                      QJsonValue value = obj.value("Developers");
                      if (value.isString()) {
                          QString strDevelopers = value.toString();
                          qDebug() << "Developers : " << strDevelopers;
                      }
                  }
              }
          }
      }
  }

QString與QJOSN的相互轉化

例子一:
QJsonObject MainWindow::QstringToJson(QString jsonString)
{
    QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toLocal8Bit().data());
    if(jsonDocument.isNull())
    {
        qDebug()<< "String NULL"<< jsonString.toLocal8Bit().data();
    }
    QJsonObject jsonObject = jsonDocument.object();
    return jsonObject;
}
 
QString MainWindow::JsonToQstring(QJsonObject jsonObject)
{
    return QString(QJsonDocument(jsonObject).toJson());
}


例子二:
//QString轉QJsonObject

QJsonObject convertQStringToQJsonObject(const QString jsonString)
{	
	QTextCodec *tc = QTextCodec::codecForName("UTF-8");//防止中文亂碼
	QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toUtf8().data());
	if (jsonDocument.isNull()){
		g_pInterface->iDataPrintf("數據解析有誤"); //判斷是否解析出問題
	}
	QJsonObject jsonObject = jsonDocument.object();
	return jsonObject;
}

//QJson轉QString
QString convertQJsonObjectToQString(const QJsonObject& jsonObject)
 {
    return QString(QJsonDocument(jsonObject).toJson());
 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章