前提
针对于里外都是对象的JSON格式
{
"test": {
"test":"1",
"test":"1"
}
}
一、JSON文件读取为Map
从JSON文件中读取数据
void Coredata::ReadJsonFile(QMap<QString,QString> &g_setting,QMap<QString,QMap<QString,QString>> &g_config){
QFile *jsonfile=new QFile("./config.json");//可执行文件路径
QByteArray arr;
arr.clear();
if(jsonfile->open(QIODevice::ReadOnly)){
qDebug()<<"文件打开成功";
arr=jsonfile->readAll();//读取数据到arr中
jsonfile->close();
if(arr.size()>0){
JsonConversionMap(arr,g_config);//JSON转换到MAP中
}
else{
qDebug()<<"文件读取失败";
errorlog->FileLog("config.json文件读取失败");
}
}
else{
qDebug()<<"文件打开失败";
errorlog->FileLog("config.json文件打开失败");
}
//释放空间
delete jsonfile;
jsonfile = nullptr;
}
转换函数
void Coredata::JsonConversionMap(QByteArray arry,QMap<QString,QMap<QString,QString>> &map){
qDebug()<<"JsonConversionMap";
QJsonParseError err;
//获取根目录
QJsonDocument doc=QJsonDocument::fromJson(arry,&err);
qDebug()<<"doc"<<doc;
if(err.error==QJsonParseError::NoError){
//转换为对象
QJsonObject obj=doc.object();
map.clear();
//QJsonObject 中键值对的无序性,传进来的顺序和输出的顺序不同
QStringList a_list=obj.keys();//存最外层的QString
qDebug()<<"a_list"<<a_list;
foreach(auto a,a_list){//通过键值遍历最外层QMap<QString,QString>
QStringList b_list=obj[a].toObject().keys();//存QMap<QString,QString>的QString
QMap<QString,QString> b_map;
foreach(auto b,b_list){//通过键值遍历最里层QString
//获取到QMap<QString,QString>
b_map.insert(b,obj[a].toObject()[b].toString());//获取到
}
//获取到QMap<QString,QMap<QString,QString>>
map.insert(a,b_map);
qDebug()<<"map"<<map;
}
}
else{
qDebug()<<"err.errorString()"<<err.errorString();
errorlog->FileLog(err.errorString());
}
}
二、Map转换为JSON格式并保存在JSO文件中
Map转换为JSON
//map转换json,层层解套
QByteArray Coredata::MapConversionJson(QMap<QString,QMap<QString,QString>> &map){
QMap<QString,QMap<QString,QString>>::iterator it;//通过迭代器
QJsonObject obj;
//通过迭代器获取QMap<QString,QMap<QString,QString>>的第一层QMap<key,value>
for(it=map.begin();it!=map.end();++it){
QMap<QString,QString>::iterator it_1;
QJsonObject obj_1;
//通过迭代器获取QMap<QString,QMap<QString,QString>>的第二层QMap<key,QMap<key,value>>
for(it_1=it.value().begin();it_1!=it.value().end();++it){
obj_1.insert(it_1.key(),it_1.value());//第二层转换为JSON对象
}
obj.insert(it.key(),obj_1);//嵌套第一层转换为JSON对象
}
QJsonDocument doc(obj);//转换为JsonDocument
return doc.toJson();
}
保存在JSO文件
//更新json文件数据
void Coredata::UpdateConfigJsonFile(QMap<QString,QMap<QString,QString>> &map){
QByteArray arr=MapConversionJson(map);//调用上述转换函数存到ByteArray中
QFile *JsonFile=new QFile("./config.json");
if(JsonFile->open(QIODevice::WriteOnly|QIODevice::Text)){
qDebug()<<"文件打开成功";
JsonFile->resize(0);
JsonFile->write(arr.data());//写入文件中
JsonFile->close();
}
else{
qDebug()<<"文件打开失败";
errorlog->FileLog("UpdateConfigJsonFile文件打开失败");
}
delete JsonFile;
JsonFile=nullptr;
}