QT如何使用QSettings访问json的内部元素

时间:2018-07-06 09:44:03

标签: json qt qsettings

这是我使用json的第一周。我目前有一项任务,使用Qsettings从json文件中读取设置并显示它们。我已经成功读取了一个非常简单的一级json,但遇到了较复杂的json。

我有以下测试json

{
 "title" : "sometitle",
 "aNumber" : 321,
 "stats": {
     "str": 34,
     "int": 56,
     "con": 22
 },
 "agentsArray": [{
     "ID": 570,
     "picture": "03803.png",
     "name": "Bob"
 }, 
 {
     "ID": 571,
     "picture": "02103.png",
     "name": "Tina"
 }]
}

我需要使用QSettings访问嵌套对象和数组的值。显示title和aNumber的值非常容易,我可以使用readJson函数在统计信息中打印这些值。 但是我似乎无法弄清楚如何从main中访问统计信息中的值

这是我的代码

主要

bool readJsonFile(QIODevice &device, QSettings::SettingsMap &map);
bool writeJsonFile(QIODevice &device, const QSettings::SettingsMap &map);

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);

   //Declare new JSON format
   const QSettings::Format jsonFormat = QSettings::registerFormat("json", readJsonFile, writeJsonFile);

   //Set default format to not specify it each time
   QSettings::setDefaultFormat(jsonFormat);

   //Using specific file
   QSettings settings("../Desktop/test/exemplu.json", jsonFormat);

   //works for title and aNumber
   qDebug() << settings.value("stats/str","empty").toString();
   qDebug() << settings.value("stats.int","empty").toString();
   qDebug()<<  settings.value("stats.con", "empty").toString();


   return a.exec();
}

readJsonFile

bool readJsonFile(QIODevice &device, QSettings::SettingsMap &map)
{
   QJsonParseError error;

   QString string = device.readAll();


   QByteArray jsonBytes = string.toLocal8Bit();
   auto document = QJsonDocument::fromJson(jsonBytes);

   if(document.isNull()){
           qDebug()<<"JSON not found";
           exit(2);
    }
    if(!document.isObject()){
        qDebug()<<"JSON is not of type object";
        exit(3);
    }

    QJsonObject json_obj=document.object();

    if(document.isEmpty()){
        qDebug()<<"JSON gol";
        exit(4);
    }
    map = json_obj.toVariantMap();

   //parsing stats
   QVariantMap stat_map = map["stats"].toMap();
   QVariantList inv_list = map["agentsArray"].toList();
   QStringList key_list = stat_map.keys();
   for(int i=0; i < key_list.count(); ++i){
       QString key=key_list.at(i);
       auto stat_val = stat_map[key.toLocal8Bit()].toString();
       qDebug() << key << ": " << stat_val;    //displays the values from stats
   }


   return true;
}

我了解到问题在于,在解析对象和数组之前我要保存整个要映射的内容,但是我不知道如何保存统计信息和map内的数组中的值。

readJsonFile的签名无法更改,我必须使用map和device。

0 个答案:

没有答案