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();
}
}
