这是我使用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。