参考文章:
https://blog.csdn.net/weixin_43729127/article/details/127522889
https://www.jb51.net/article/265575.htm
上代码:
从json文件中读取内容保存到map数据结构中
void Frange::JsonToMap(){
//todo::if json not exit ,crete one
//QFile file("C:/Users/user/Documents/FringeControl/recipes.json"); //创建QFile对象,并指定json文件路径
QFile file(QDir::currentPath());
if(!file.open(QIODevice::ReadOnly)){
std::cout<<" open json filed "<<std::endl;
return;
}
//将文件内容读取到数组中
QByteArray data(file.readAll());
file.close(); //关闭文件
QJsonParseError jError; //创建QJsonParseError对象
//使用QJsonDocument的fromJson函数读取json串,并将QJsonParseError对象传入获取错误值
QJsonDocument jDoc = QJsonDocument::fromJson(data, &jError);
//判断QJsonParseError对象获取的error是否包含错误,包含则返回0
if(jError.error != QJsonParseError::NoError){
std::cout<<"open json filed too "<<std::endl;
return ;
}
std::cout<<"open json success too "<<std::endl;
QJsonObject jObj = jDoc.object();
Recipe cur_rcp;
if(jObj.size())
{
int modeNum = jObj.size();
int count = 0;
QStringList names = jObj.keys();
std::cout<<"recipes modenum is "<<modeNum<<std::endl;
//循环读取json外圈大循环mode
for(const auto& rcp : jObj)
{
QJsonObject obj2 = rcp.toObject();
cur_rcp.name = names.at(count);
std::string str = cur_rcp.name.toStdString();
//std::cout<<"cur rcp name is "<<str.c_str()<<std::endl;
cur_rcp.level = obj2["level"].toInt();
//std::cout<<"cur rcp level is "<<cur_rcp.level<<std::endl;
cur_rcp.amplitude = obj2["amplitude"].toInt();
//std::cout<<"cur rcp amplitude is "<<cur_rcp.amplitude<<std::endl;
cur_rcp.angle = obj2["angle"].toInt();
//std::cout<<"cur rcp angle is "<<cur_rcp.angle<<std::endl;
cur_rcp.time = obj2["time"].toInt();
//std::cout<<"cur rcp Time is "<<cur_rcp.Time<<std::endl;
cur_rcp.phase = obj2["phase"].toInt();
//std::cout<<"cur rcp phase is "<<cur_rcp.phase<<std::endl;
cur_rcp.spacing = obj2["spacing"].toInt();
//std::cout<<"cur rcp spacing is "<<cur_rcp.spacing<<std::endl;
m_savedrecips.insert(std::pair<QString, Recipe>(cur_rcp.name, cur_rcp));
cur_rcp.Clear();
count++;
}
std::cout<<"read json end,now there are "<<m_savedrecips.size()<<" recipes "<<std::endl;
}
}
从数据结构中存储数据到json
void Frange::MapToJson(){
if(m_savedrecips.size() < 1){
std::cout<<"recipes is null"<<std::endl;
QJsonObject jObj;
QJsonDocument doc(jObj);
QByteArray data = doc.toJson();
QFile file("C:/Users/user/Documents/FringeControl/recipes.json");
file.open(QIODevice::WriteOnly);//打开文件
file.write(data);//开始写入数据进去
file.close();
return;
}
QJsonObject jObj;
for(auto& rcp : m_savedrecips){
QJsonObject obj;
obj.insert("level",rcp.second.level);
obj.insert("phase", rcp.second.phase);
obj.insert("angle", rcp.second.angle);
obj.insert("spacing", rcp.second.spacing);
obj.insert("time", rcp.second.time);
obj.insert("amplitude", rcp.second.amplitude);
//数组中元素添加完成后将其添加到根对象中
jObj.insert(rcp.first, QJsonValue(obj));
}
QJsonDocument doc(jObj);
QByteArray data = doc.toJson();
QFile file("C:/Users/user/Documents/FringeControl/recipes.json");
file.open(QIODevice::WriteOnly);//打开文件
file.write(data);//开始写入数据进去
file.close();
std::cout<<"Map to json, now are "<<m_savedrecips.size()<<std::endl;
}