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());
 }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值