Qt_Json文件读写的简单实例
1、Qt文件中的Json相关类的介绍
(1)QJsonDocument
QJsonDocument类提供了一种读取和写入JSON文档的方法。
QJsonDocument是一个包装完整JSON文档的类,它既可以从基于UTF-8编码的文本表示法,也可以从Qt自己的二进制格式中读取和写入这个文档。
一个JSON文档可以使用QJsonDocument::fromJson()从基于文本的表示方式转换为QJsonDocument,toJson()将其转换回文本。该解析器非常快速和高效,并将JSON转换为Qt使用的二进制表示。
可以通过 !isNull() 查询解析后文档的有效性。可以使用isArray()和isObject()查询一个文档是否包含一个数组或一个对象。可以使用array()或object()检索文档中包含的数组或对象,然后进行读取或操作。
(2)QJsonObject
QJsonObject类封装了一个JSON对象。
一个JSON对象是一个键值对的列表,其中键是唯一的字符串,而值则由QJsonValue表示。一个QJsonObject可以转换为一个QVariantMap,也可以从QVariantMap转换为QJsonObject。
你可以用size()、insert()和remove()条目查询它的(键、值)对的数量,并使用标准的C++迭代器模式对其内容进行迭代。
QJsonObject是一个隐式共享类,只要不被修改,它就会与它所创建的文档共享数据。你可以通过QJsonDocument将对象转换成基于文本的JSON。
(3)QJsonValue
QJsonValue类封装了JSON中的一个值。
JSON中的值可以是6种基本类型之一。JSON是一种存储结构化数据的格式。它有6种基本数据类型。
bool QJsonValue::Bool
double QJsonValue::Double
string QJsonValue::String
array QJsonValue::Array
object QJsonValue::Object
null QJsonValue::Null
一个值可以代表以上任何一种数据类型。此外,QJsonValue有一个特殊的标志来表示未定义的值。这可以通过isUndefined()来查询。
值的类型可以用type()或isBool()、isString()等访问器来查询。同样,也可以用toBool()、toString()等将值转换为存储在其中的类型。
(4)QJsonArray
QJsonArray类封装了一个JSON数组。
JSON数组是一个值的列表。该列表可以通过从数组中插入和删除QJsonValue来操作。
一个QJsonArray可以被转换为一个QVariantList。你可以使用size()、insert()和remove()来查询它的条目数,并使用标准的C++迭代器模式对其内容进行迭代。
QJsonArray是一个隐式共享类,只要不被修改,它就会与它所创建的文档共享数据。你可以通过QJsonDocument将数组转换成基于文本的JSON。
2、一个简单实例
//test.json
{
"num": [
1,
2
],
"server": {
"IP": "192.168.1.25",
"Port": "1234",
"no": [
3,
4
]
}
}
(1)构建上面的json文件
//创建json对象
QJsonObject obj;
QJsonObject sub_obj;
QJsonArray sub_array, sub_array2;
//向json对象插入键值对
sub_obj.insert("IP",QJsonValue("192.168.1.25"));
sub_obj.insert("Port","1234");
//向json数组插入值
sub_array.push_back(QJsonValue(1));
sub_array.push_back(QJsonValue(2));
sub_array2.push_back(QJsonValue(3));
sub_array2.push_back(QJsonValue(4));
//向子对象插入键值对,其中值为json数组或json对象
sub_obj.insert("no",QJsonValue(sub_array2));
obj.insert("server",QJsonValue(sub_obj));
obj.insert("num",QJsonValue(sub_array));
//转换为json文件对象
QJsonDocument doc(obj);
//将json文件对象转换为字符串
QByteArray data = doc.toJson();
//写入文件
QFile file_json("E:\\Qt_Code\\airCloud\\test.json");
file_json.open(QIODevice::ReadWrite);
file_json.write(data);
//关闭文件
file_json.close();
(2)解析上面的json文件
//读取json文件
QFile file2_json("E:\\Qt_Code\\airCloud\\test.json");
file2_json.open(QIODevice::ReadWrite);
//json文件读入字符串
QByteArray data = file2_json.readAll();
file2_json.close();
//使用字符串初始化json文件对象
QJsonDocument doc = QJsonDocument::fromJson(data);
//判断是否是对象
if(doc.isObject()){
//json文件对象转换为QJsonObject
QJsonObject obj = doc.object();
//解析对象,val是键“server”的值,是一个QJsonValue::Object
QJsonValue val = obj.value("server");
if(val.isObject()){
//从QJsonValue::Object转换为QJsonObject
QJsonObject sub_obj = val.toObject();
//取值
QString ip = sub_obj.value("IP").toString();
QString port = sub_obj.value("Port").toString();
//打印调试信息
qDebug() << ip<< port<< endl;
}
//解析数组
QJsonValue val_array = obj.value("num");
//vec_d存放解析出来的double数组
QVector<double> vec_d;
//判断是否是QJsonValue::Array
if(val_array.isArray()){
//将QJsonValue::Array转换为QJsonArray
QJsonArray array = val_array.toArray();
//获取数组长度
int nSize = array.size();
//遍历数组将其存入vec_d
for (int i = 0; i < nSize; ++i){
//检查数组元素的类型
QJsonValue value = array.at(i);
//如果是double则放入vec_d
if (value.type() == QJsonValue::Double){
vec_d.push_back(value.toDouble());
//打印调试信息
qDebug() << value.toDouble();
}
}
}
}
注:Qt中Json相关类的介绍来自Qt官方文档。