Qt中读写json文件

以json原文如下为例:

{//一级大括号
    "first fruit":
    {//二级大括号
        "describe":"an apple",
        "icon":"appleIcon",
        "name":"apple"
    },
    "second fruit":
    {
        "describe":"an orange",
        "icon":"orangeIcon",
        "name":"orange"
    },
    "three fruit array":
    [//二级中括号
        "eat 0",
        "eat 1",
        "eat 2",
        "eat 3",
        "eat 4"
    ]
}

其中,我们可以将一级大括号内的所有内容看作是一个一级的QJsonObject,记作一级Obj;在一级Obj中,有两个并列的二级大括号,和中括号,这三者可以被分别看做一个二级Obj;以此类推甚至可以是N即Obj;

在每一级Obj中,根据关键字Key值,如在一级Obj内有三个Krey值: "first fruit", "second fruit","three fruit array";可以根据key值找到对应的二级Obj,然后可以在二级Obj中根据其中的key值找到三级的,以此类推;

如果某级Obj中不再含有下一级Obj,或者不仅含有下级Obj,如上面的二级大括号内就不在含有下级Obj,那么分两种情况,一种是以key:value的形式存在,如上面的两个二级大括号 中的内容。另一种是上面的二级中括号中以array形式存在的并列项,有点像是枚举一样。根据两种情况,用两种方式取出具体的某个值,如:"icon":"orangeIcon" 或"eat 1"。

根据以上对json结构的简单理解,再看下面的代码,可能会容易理解一点。尤其是第二部分的代码。

#include <QJsonDocument>

#include <QJsonParseError>

#include <QFile>

#include <QJsonObject>

#include <QDebug>

#include <QJsonArray> 

QFile loadFile("D:\\1.json");

 if(!loadFile.open(QIODevice::ReadOnly))
    {
        qDebug() << "could't open projects json";
        return;
    }

    QByteArray allData = loadFile.readAll();
    loadFile.close();

    QJsonParseError json_error;
    QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &json_error));

    if(json_error.error != QJsonParseError::NoError)
    {
        qDebug() << "json error!";
        return;
    }

    QJsonObject rootObj = jsonDoc.object();

    //输出所有key,这一步是非必须的
    QStringList keys = rootObj.keys();
    for(int i = 0; i < keys.size(); i++)
    {
        qDebug() << "key" << i << " is:" << keys.at(i);
    }

    //因为是预先定义好的JSON数据格式,所以这里可以这样读取
    if(rootObj.contains("first fruit"))
    {
       QJsonObject subObj = rootObj.value("first fruit").toObject();
       qDebug() << "describe is:" << subObj["describe"].toString();
       qDebug() << "icon is:" << subObj["icon"].toString();
       qDebug() << "name is:" << subObj["name"].toString();
    }

    if(rootObj.contains("second fruit"))
    {
       QJsonObject subObj = rootObj.value("second fruit").toObject();
       qDebug() << "describe is:" << subObj.value("describe").toString();
       qDebug() << "icon is:" << subObj.value("icon").toString();
       qDebug() << "name is:" << subObj.value("name").toString();
    }

    if(rootObj.contains("three fruit array"))
    {
       QJsonArray subArray = rootObj.value("three fruit array").toArray();
       for(int i = 0; i< subArray.size(); i++)
       {
           qDebug() << i<<" value is:" << subArray.at(i).toString();
       }
   }

输出结果:

key 0  is: "first fruit"
key 1  is: "second fruit"
key 2  is: "three fruit array"
describe is: "an apple"
icon is: "appleIcon"
name is: "apple"
describe is: "an orange"
icon is: "orangeIcon"
name is: "orange"
0  value is: "eat 0"
1  value is: "eat 1"
2  value is: "eat 2"
3  value is: "eat 3"
4  value is: "eat 4"
 

上面是只含有两级Obj的情况,下面是更复杂一点的多级obj,只要遵循一点,就是在每一级上,将obj作为一个独立的obj,使用一样的方式再向其所包含的下一级obj获取信息,就容易些。

1.读取Json文档中的值:

QString getJsonParas(QString path, QString firstFlag, QString secondFlag,int index)
{
    QString paras="";
    QFile file(path);
    if (!file.open(QIODevice::ReadOnly)){
        qDebug()<<"file.open  ReadOnly   fail";
        return "";
    }
    //从json文件读取信息
   QByteArray allData=file.readAll();
   file.close();
   //qDebug()<<allData;
   QJsonParseError json_error;
   QJsonDocument jsonDoc;
   jsonDoc=QJsonDocument::fromJson(allData, &json_error);
   if(json_error.error != QJsonParseError::NoError)
      {
           qDebug() << "json error!";
           qDebug()<<json_error.errorString();
           return paras;
       }
     QJsonObject rootObj = jsonDoc.object();
     QStringList keys = rootObj.keys();
     if(rootObj.contains(firstFlag)){
         QJsonObject subObj=rootObj.value(firstFlag).toObject();
         if(subObj.contains(secondFlag)){
             if(!subObj.value(secondFlag).isObject()){
                  return subObj.value(secondFlag).toString();
             }
         }
     }
     else{

         for(int i=0;i<keys.size();i++){
            QString flag =keys.at(i);
            QJsonObject subObj=rootObj.value(flag).toObject();//从一级OBJ得到二级OBJ
            QStringList keyss=subObj.keys();
            if(subObj.contains(firstFlag)){
                QJsonArray exchanges=subObj.value(firstFlag).toArray();//从二级OBJ得到三级中括号形式的OBJ即array
                QJsonObject exchange=exchanges.at(0).toObject();//将三级的array中的第几个元素转为第四级的OBJ
                if(!exchange.value(secondFlag).isArray()){//判断第四级OBJ中是否含有名叫secondFlag的key
                    return exchange.value(secondFlag).toString();
                }
              }
//            else{
//                for(int j=0;j<keyss.size();j++){
//                    QString flagkey=keyss.at(j);
//                    QJsonObject subObjs=rootObj.value(flagkey).toObject();
//                    if(subObjs.contains(firstFlag)){
//                        QJsonArray queues=subObjs.value(firstFlag).toArray();
//                        QJsonObject queue=queues.at(index).toObject();
//                        return queue.value(secondFlag).toString();
//                    }
//                }
//            }
         }
         //
         QJsonObject subObj=rootObj.value("virtualhost").toObject();
         QJsonArray exchanges=subObj.value("exchanges").toArray();
         QJsonObject exchange=exchanges.at(0).toObject();
         if(exchange.contains(firstFlag)){
         QJsonArray queues=exchange.value(firstFlag).toArray();
         QJsonObject queue=queues.at(index).toObject();
          if(queue.contains(secondFlag)){
              return queue.value(secondFlag).toString();
          }
         }

         subObj=rootObj.value("virtualhost").toObject();
         exchanges=subObj.value("exchanges1").toArray();
         exchange=exchanges.at(0).toObject();
         if(exchange.contains(firstFlag)){
         QJsonArray queues=exchange.value(firstFlag).toArray();
         QJsonObject queue=queues.at(index).toObject();
          if(queue.contains(secondFlag)){
              return queue.value(secondFlag).toString();
          }
       }
   }
2.修改json文档中属性的值:

bool setJsonParas(QString path, QString firstFlag, QString secondFlag,int index,QString para)
{
    QFile file(path);
    if (!file.open(QIODevice::ReadOnly)){
        qDebug()<<"file.open  ReadOnly   fail";
        return "";
    }
    //从json文件读取信息
    bool res=false;
   QByteArray allData=file.readAll();
   file.close();
   QJsonParseError json_error;
   QJsonDocument jsonDoc;
   jsonDoc=QJsonDocument::fromJson(allData, &json_error);
   if(json_error.error != QJsonParseError::NoError)
      {
           qDebug() << "json error!";
           qDebug()<<json_error.errorString();
           return res;
       }
   QJsonObject rootObj = jsonDoc.object();
   QStringList keys = rootObj.keys();
   if(rootObj.contains(firstFlag)){
       QJsonObject subObj=rootObj.value(firstFlag).toObject();
       if(subObj.contains(secondFlag)){
          QJsonValue jsonvalue(para);
          subObj.insert(secondFlag,jsonvalue);
          res=true;
          QJsonValue subvalue(subObj);
          rootObj.insert(firstFlag,subvalue);
       }
   }
   else{
       for(int i=0;i<keys.size();i++){
           QString key=keys.at(i);
           QJsonObject subObj=rootObj.value(key).toObject();
           if(subObj.contains(firstFlag)){
               QJsonArray subObjarray=subObj.value(firstFlag).toArray();
               QJsonObject subOjs=subObjarray.at(0).toObject();
               if(subOjs.contains(secondFlag)){
                   QJsonValue jsonvalue(para);
                   subOjs.insert(secondFlag,jsonvalue);
                   res=true;
                   QJsonArray jsonArray;
                   QJsonValue subsValue(subOjs);
                   jsonArray.insert(0,subsValue);
                   QJsonValue subValue(jsonArray);
                   subObj.insert(firstFlag,subValue);
                   QJsonValue  rootValue(subObj);
                   rootObj.insert(key,rootValue);
               }
           }
       }
   }
   QJsonObject subObj=rootObj.value("virtualhost").toObject();
   QJsonArray subArray=subObj.value("exchanges").toArray();
   QJsonObject subsObj=subArray.at(0).toObject();
   if(subsObj.contains(firstFlag)){
       QJsonArray subObjArray=subsObj.value(firstFlag).toArray();
       QJsonObject subObj1=subObjArray.at(index).toObject();
       if(subObj1.contains(secondFlag)){
           QJsonValue jonsvalue(para);
           subObj1.insert(secondFlag,jonsvalue);
           res=true;
           QJsonValue subvalue1(subObj1);
           subObjArray.removeAt(index);
           subObjArray.insert(index,subvalue1);
           QJsonValue subsvalue(subObjArray);
           subsObj.insert(firstFlag,subsvalue);
           QJsonValue subsObjvalue(subsObj);
           subArray.removeAt(0);
           subArray.insert(0,subsObjvalue);
           QJsonValue subvalue(subArray);
           subObj.insert("exchanges",subvalue);
           QJsonValue rootvalue(subObj);
           rootObj.insert("virtualhost",rootvalue);
       }
   }
   if(res==false){
       return res;
   }

   QFile filejson(path);
   if( !filejson.open( QFile::WriteOnly | QFile::Truncate) ){
       qWarning("error::ParserXML->writeOperateXml->file.open\n");
       return false;
   }
   QJsonDocument json;
   json.setObject(rootObj);
   QByteArray byte_array = json.toJson();
   filejson.write(byte_array);
   filejson.close();
   return true;
}
 

猜你喜欢

转载自blog.csdn.net/qq_33485434/article/details/85270160