Qt操作json文件


json 數據

在Qt中常見的數據傳輸格式為 xml 與 json 這個兩種,其中 xml 在1996年提出是一種出現時間相對較久的文件格式,與2002年提出的json相比,他可以標注數據的一些屬性,並且可以直接被html識別。相比較來說json就是比較簡潔,人的可讀性更強。更適合用來傳輸數據。

json格式:

標准格式:

#JSON字符串
{"name":"jobs"}

#JSON布爾:必須小寫的true和false
{"bool":true}

#JSON空:必須小寫的null
{"object":null}

示例:

{
    "name" : "mil",
    "age" : 15,

    "language": ["zh", "eng"],

    "course" : [{
            "name" : 'math",
            "score": 66
    },{
            "name" : "eng",
            "score": 99
    }]
}

在Qt中 使用QJsonDocument讀寫json文件。

類說明
QJsonDocument 讀寫json文檔
QJsonObject 封裝Json對象
QJsonArry 封裝json數組
QJosnValue 封裝json值,int,flot,double,{},[]
QJsonObject
QJsonParseError 所選json處理過程中出現的錯誤

封裝 json

void Widget::pkjson()
{
    QFile jsfile("../test_1.json");


    // ---> 封裝/保存 json
    QJsonObject rootObj;
    QJsonObject professionalObj;
    professionalObj.insert("english", 4);

    QJsonArray languageArr;
    languageArr.append("c");
    languageArr.append("c++");

    rootObj.insert("name","milo");
    rootObj.insert("age",80);
    rootObj.insert("professional", professionalObj);
    rootObj.insert("phone","milo");
    rootObj.insert("language", languageArr);
    rootObj.insert("hard","milo");
    rootObj.insert("hot","milo");

    QJsonDocument jdoc(rootObj);

    // ---> 打開文件並向文件中添加內容
    if(jsfile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) {
        QTextStream js(&jsfile);
        js<< jdoc.toJson();
        jsfile.close();
    } else {
        cout << "打開失敗";
    }
}


解析 json


void Widget::exjson()
{
    // ---> 解包json
    QFile jsfile("../test_1.json");
    if(jsfile.open(QIODevice::ReadOnly)){
        // ---> 設置解析報錯
        QJsonParseError err;
        // ---> 解釋json文件
        QJsonDocument jsdoc = QJsonDocument::fromJson(jsfile.readAll(), &err);

        if(err.error!=QJsonParseError::NoError){
            // ---> 如果有報錯
            cout << "json 格式錯誤!";
            return;
        } else {
            // ---> 讀取根目錄
            QJsonObject rootObj = jsdoc.object();
            // ---> 讀取 key = name 的值
            cout << rootObj.value("name").toString();

            QJsonArray lanArr = rootObj.value("language").toArray();
            cout << lanArr.at(0).toString() << lanArr.at(1).toString();

            // ---> 判斷key的類型 , 是arry 還是 obj
            if(rootObj.value("professional").type() == QJsonValue::Object){
                cout << "這個key的類型是 obj";
            }
        }
        jsfile.close();
    }
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM