QT5.6 創建和解析json文件

本文參考 : https://www.cnblogs.com/senior-engineer/p/5608985.html
https://blog.csdn.net/hp_cpp/article/details/80338116
https://blog.csdn.net/u011086209/article/details/86073799
#include "mainwindow.h"
#include <QApplication>

#include <QDebug>

#include <QJsonObject>
#include <QJsonDocument>
#include <QByteArray>
#include <QString>
#include <QJsonParseError>
#include <QJsonArray>
#include <QFile>

/*
 *   json : 大括號表示對象, 中括號表示數組
*/

void createJson();
void creatJsonArray();
void creatJsonArray2();
void paserJson();
void WriteFile(QString file,QString json_str);
void paserJsonObject(QString f);
void parseJsonArray(QString f);
void parse(QString f);
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
   // createJson();        //1. 創建一個單獨的一個json對象文件
    //creatJsonArray();    //2. 創建一個單獨的一個json數組文件
    //creatJsonArray2();   //創建一個既有json object 和json array組合的對象。

    paserJsonObject("F:/dev1.json");
    parseJsonArray("F:/dev2.json");
    parse("F:/dev3.json");

    return a.exec();
}





QByteArray byte_array;
QByteArray byte_array1;

//1. 創建一個單獨的一個json對象文件
void createJson()
{
   QJsonObject json;
   json.insert("name", QString("Qt"));
   json.insert("version", 5);
   json.insert("windows", true);

   QJsonDocument document;
   document.setObject(json);
   byte_array= document.toJson(QJsonDocument::Compact);
   QString json_str(byte_array);

   qDebug()<<"json_str:"<<json_str;
   qDebug()<<"json:"<<json;

   WriteFile("F:/dev1.json",json_str);
   qDebug()<<"write dev1.json"<<json;
}

//2. 創建一個單獨的一個json數組文件
void creatJsonArray()
{

   QJsonArray json;
   json.insert(0, QString("Qt"));
   json.insert(1, QString("version"));
   json.insert(2, true);

   QJsonDocument document;
   document.setArray(json);
   byte_array1= document.toJson(QJsonDocument::Compact);
   QString json_str(byte_array1);
   qDebug()<<"json_str="<<json_str;
   WriteFile("F:/dev2.json",json_str);
   qDebug()<<"write dev2.json"<<json;
}

//創建一個既有json object 和json array組合的對象。
void creatJsonArray2()
{
    QJsonDocument document;

    QJsonObject json1;                 //創建一個json對象
    json1.insert("name", QString("Qt"));

    QJsonObject json2;
    json2.insert("version", 5);

    QJsonObject json3;
    json3.insert("windows", true);

    QJsonArray json;
    json.insert(0, json1);
    json.insert(1, json2);
    json.insert(2, json3);

    document.setArray(json);         //設置 json array

    QJsonObject root;
    root.insert("root", json);
    document.setObject(root);        // json array 添加到json object
    byte_array1= document.toJson(QJsonDocument::Compact);
    QString json_str(byte_array1);

    qDebug()<<"json_str="<<json_str;

    WriteFile("F:/dev3.json",json_str);  //write file
    qDebug()<<"write dev3.json";

}




void parseJsonArray(QString f) //解析dev2.json
{
    qDebug()<<"parseJsonArray .....................................";
    QFile file(f);
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QString value = file.readAll();
    file.close();

   QJsonParseError json_error;
   QJsonDocument parse_doucment = QJsonDocument::fromJson(value.toUtf8(), &json_error);
   if(json_error.error == QJsonParseError::NoError)
   {
       if(parse_doucment.isArray())
       {
   QJsonArray array = parse_doucment.array();
   int size = array.size();
   for(int i=0; i<10;i++)
           {
       QJsonValue value = array.at(i);
       if(value.isString())
       {
   QString name = value.toString();
   qDebug()<<"name="<<name;
       }
       else if(value.isBool())
       {
   bool flag = value.toBool();
    qDebug()<<"flag="<<flag;
       }
   }
       }
   }
}




void paserJsonObject(QString f)   //解析dev1.json
{
    qDebug()<<"paserJsonObject start.....................................";
    QFile file(f);
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QString value = file.readAll();
    file.close();

   QJsonParseError json_error;
   QJsonDocument parse_doucment = QJsonDocument::fromJson(value.toUtf8(), &json_error);
   if(json_error.error == QJsonParseError::NoError)
   {
       if(parse_doucment.isObject())
       {
           QJsonObject obj = parse_doucment.object();
           if(obj.contains("name"))
           {
            QJsonValue name_value = obj.take("name");
             if(name_value.isString())
          {
             QString name = name_value.toString();
             qDebug()<<"name="<<name;
          }
           }
         if(obj.contains("version"))
   {
       QJsonValue version_value = obj.take("version");
       if(version_value.isDouble())
       {
   int version = version_value.toVariant().toInt();
    qDebug()<<"version="<<version;
       }
   }
   if(obj.contains("windows"))
   {
       QJsonValue version_value = obj.take("windows");
       if(version_value.isBool())
       {
   bool flag = version_value.toBool();
   qDebug()<<"windows="<<flag;
       }
   }
       }
   }

}

void WriteFile(QString file,QString json_str)
{
  QFile t_file(file);      //生成一個文件
  if(!t_file.open(QIODevice::WriteOnly/*| QIODevice::Append)*/))
  {
    qDebug() << "打開文件失敗";
  }
  QTextStream t_stream(&t_file);//文本流關聯文件對象
  t_stream<<json_str;
  t_file.close(); //關閉文件
}

void parse(QString f) // 用於解析dev3.json
{
    qDebug()<<"parse dev3.json.....................................";
    QFile file(f);
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QString value = file.readAll();
    file.close();

   QJsonParseError json_error;
   QJsonDocument parse_doucment = QJsonDocument::fromJson(value.toUtf8(), &json_error);
   if(json_error.error == QJsonParseError::NoError)
   {
       if(parse_doucment.isObject())
       {
           QJsonObject obj = parse_doucment.object();
           if(obj.contains("root"))
           {
           QJsonValue arrayValue = obj.value(QStringLiteral("root"));
             if(arrayValue.isArray())
          {
                 QJsonArray array = arrayValue.toArray();
                 for (int i = 0; i < array.size(); i++)
                 {
                     QJsonValue nameArray = array.at(i);
                     QJsonObject key = nameArray.toObject();
                     if(key["name"].isString())
                     {
                       qDebug() << "key[name]==" << key["name"].toString();
                     }
                     else if(key["version"].isDouble())
                     {
                       qDebug() << "key[version]==" << key["version"].toInt();
                     }
                     else if(key["windows"].isBool())
                     {
                         qDebug() << "key[windows]==" << key["windows"].toBool();
                     }

                 }
          }


       }
   }

}
}

QString  FileHandler::ReadFile(const QString f)
{
  qDebug()<<"paserJsonObject start.....................................";
  QFile t_file(f);

  if(!t_file.open(QIODevice::ReadOnly | QIODevice::Text))
  {
    qDebug() << "打開文件失敗";
    return "false" ;
  }

  QString value = t_file.readAll();
  t_file.close();
  return value;
}


void FileHandler::paserComDevFile(QString f)   //解析dev4.json
{
   QString value=ReadFile(f);
   QJsonParseError json_error;
   QJsonDocument parse_doucment = QJsonDocument::fromJson(value.toUtf8(), &json_error);
   if(json_error.error == QJsonParseError::NoError)
   {
    {
       if(parse_doucment.isObject())
       {
           QJsonObject rootobj= parse_doucment.object();
         if(rootobj.contains("root"))
         {

             QJsonObject subObj = rootobj.value("root").toObject();
             qDebug() << " name is:" << subObj["name"].toString();
             qDebug() << " windows is:" << subObj["windows"].toString();
             qDebug() << " version is:" << subObj["version"].toString();


     }}
   }
   }
   else
       qDebug()<<"json error:"<<json_error.error;

}

 

 

文件dev1.json

{"name":"Qt","version":5,"windows":true}

dev2.json 

["Qt","version",true]

dev3.json

{"root":[{"name":"Qt"},{"version":5},{"windows":true}]}

dev4.json
{
    "root":{
        "name":"Qt",
        "windows":"true",
        "version":"5"

    }
}
 

 

 

 

 

 

 

 

 

最後總結:

首先區分是jsonArray  或者是jisonObject.

因爲object 遵循的是 key,value 這樣的鍵值對。那麼解析object的時候

可以有兩種方法:

  {

      "root":{"name":"Qt",“version”,"1.0"}

  }

方法1:

if(root.contains("name"))

 { 

   QJsonvalue name_value=rootobj.take("name");

  qDebug()<<"name_value"<<name_value.toString();

}

方法2:見解析dev4.json   key[name]

 

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