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