json主要是三种格式:object(对象)、array(数组)、value(值)。
object对象是使用大括号{ }括起来的部分,每一个{}都代表一个独立的对象。
每个对象都是由一个或者多个无序的键值对组成的,键值对——名称/值,名称的后面跟着一个“:”,名称之间使用“,”分隔。
如:
//上下两个大括号表明这是一个object
{
//里面由一个或多个 名称/值 对组成,之间用,分隔
"name": "Xiao Ming",
"age": 18,
"sex": "male"
}
array数组是使用中括号[ ]括起来的那部分。
数组是一组有序的值的集合,值之间使用“,”进行分隔。
如:
[
"data": 1,
"data": 2,
"data": 3
]
注意,这里面说的是“值”,这个值是一个比较抽象的概念,不是简单的一个字符串或者是一个数字,下面介绍值。
这个值是一个抽象的概念,并不是一个确定的类型,可以是简单的字符串或者是数字,也可以是上面介绍的对象、数组,甚至还可以各种深层次嵌套的东西。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array)。
这些结构可以嵌套。
如:
{
"name":"Xiao Ming",//这是字符串
"age":18,//这是数字
"grade":[//这里面的值是“对象的数组”,甚至可以无限嵌套下去
{
"name":"English",
"score":80
},
{
"name":"Math",
"score":90
},
{
"name":"Chinese",
"score":100
}
]
}
至此,json中的基础内容介绍结束。
下面开始在Qt中操作json格式数据的介绍。
第一部分介绍了json的结构,分为对象object、数组array、值value。
鉴于此,在Qt下有三种对于json数据的基本操作,分别为:QJsonObject、QJsonArray、QJsonValue。
以及对于解析错误进行描述的类:QJsonParseError(Qt解析错误)。
因为对象object中有值value,而值value又是一个名称/值对,所以对于QJsonObject来说,可以直接使用QJsonObject::value()来获得指定字段的值。
另外的功能见下图,其中使用最多的就是QJsonObject::value()这个函数:
因为值value基本上可以是任何的类型,所以值value也可以是对象object、数组array,因此对于QJsonValue而言,可以使用QJsonValue::toObject(),和QJsonValue::toArray()将值value转化为对象object或者是数组array。
对于数组array而言,其实可以把它当成Qt中的QVector看待,可以执行添加、删除、插入,还进行了operator操作符的重载操作,拿我来说,我就喜欢直接用下标的方式来进行操作,因为下标在没有这个字段的时候,会自动执行插入操作,相当方便。
具体的函数如下图所示:
这里以我的代码来进行表示吧,读写的格式如下方所示:
//读取格式
{
"version": "1.0",
"type": 0,
“fields”: [
{
"db_name": "xxx",
"table_name": "xxx",
"field_name": "xxx"
},
{
"db_name": "xxx",
"table_name": "xxxx",
"field_name": "xxx"
},
{
"db_name": "xxx",
"table_name": "xxx",
"field_name": "xxx"
}
]
}
代码如下:
//读取json文件
void MainWindow::readJson()
{
QFile file(FILE_PATH);
if (!file.open(QIODevice::ReadOnly))
{
ui->plainTextEdit->appendPlainText("文件打开失败");
return;
}
QJsonParseError parseError;
QJsonDocument document = QJsonDocument::fromJson(file.readAll(), &parseError);
if (parseError.error != QJsonParseError::NoError)
{
ui->plainTextEdit->appendPlainText("Json 文件读取失败");
ui->plainTextEdit->appendPlainText(parseError.errorString());
return;
}
if (document.isObject())
{
QJsonObject object = document.object();
if (object.contains("version"))
{
QJsonValue version = object.value("version");
ui->plainTextEdit->appendPlainText("version: " + version.toString());
}
if (object.contains("type"))
{
QJsonValue type = object.value("type");
ui->plainTextEdit->appendPlainText("type: " + QString::number(type.toInt()));
}
if (object.contains("fields"))
{
QJsonValue fields = object.value("fields");
if (fields.isArray())
{
QJsonArray array = fields.toArray();
int size = array.size();
for (int i(0); i<size; ++i)
{
QJsonObject object = array.at(i).toObject();
QJsonValue dbName = object.value("db_name");
QJsonValue tableName = object.value("table_name");
QJsonValue fieldName = object.value("field_name");
ui->plainTextEdit->appendPlainText("dbName: " + dbName.toString());
ui->plainTextEdit->appendPlainText("tableName: " + tableName.toString());
ui->plainTextEdit->appendPlainText("fieldName: " + fieldName.toString());
}
}
}
}
file.close();
}
//写json文件
void MainWindow::writeJson()
{
QFile file(FILE_PATH);
if (!file.open(QIODevice::WriteOnly))
{
ui->plainTextEdit->appendPlainText("文件打开失败");
return;
}
QJsonObject object;
object.insert("version", "2.0");
object["type"] = 2;//此处使用了两种方式
QJsonObject temp1;
temp1.insert("db_name", "New DB1");
temp1.insert("table_name", "New Table1");
temp1["field_name"] = "New Field1";
QJsonObject temp2;
temp2.insert("db_name", "New DB2");
temp2.insert("table_name", "New Table2");
temp2["field_name"] = "New Field2";
QJsonObject temp3;
temp3.insert("db_name", "New DB3");
temp3.insert("table_name", "New Table3");
temp3["field_name"] = "New Field3";
QVector<QJsonObject> vec;
vec.push_back(temp1);
vec.push_back(temp2);
vec.push_back(temp3);
QJsonArray arr;
for (int i(0); i<vec.size(); ++i)
{
arr.insert(i, vec.at(i));
}
object["fields"] = arr;
QJsonDocument document;
document.setObject(object);
file.write(document.toJson(QJsonDocument::Indented));
file.close();
}
原始文件:
读取结果:
写入之后的文件:
再次读取的结果如下:
掌握json的三个重要结构:对象object、数组array、值value。
Qt操作的三个重要组成:QJsonObject、QJsonArray、QJsonValue
Qt的补充操作:QJsonParseError错误信息类、QJsonDocument文件相关类
另外,就是值value的各种嵌套了,操作上也是这样,代码的读取与写入都是各种值的嵌套操作,只要遵循两者间通信的协议即可,其余可即兴发挥。
参考链接1
参考链接2
参考链接3