QT 内のデータを JSON ファイルに保存する

参考記事:

https://blog.csdn.net/weixin_43729127/article/details/127522889

https://www.jb51.net/article/265575.htm

上記のコード:

json ファイルからコンテンツを読み取り、マップ データ構造に保存します。

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;

}

おすすめ

転載: blog.csdn.net/cyy1104/article/details/128920753