json介绍及使用QJson操作json格式数据

文章目录

  • json格式介绍
    • 1.object对象
    • 2.array数组
    • 3.value值
  • Qt下操作json格式的数据
    • QJsonObject
    • QJsonValue
    • OJsonArray
  • 例子演示
    • json格式
    • 源代码
    • 演示结果
  • 总结

json格式介绍

json主要是三种格式:object(对象)、array(数组)、value(值)。

1.object对象

object对象是使用大括号{ }括起来的部分,每一个{}都代表一个独立的对象。
每个对象都是由一个或者多个无序键值对组成的,键值对——名称/值,名称的后面跟着一个“:”,名称之间使用“,”分隔。
如:

//上下两个大括号表明这是一个object
{
	//里面由一个或多个 名称/值 对组成,之间用,分隔
	"name": "Xiao Ming",
	"age": 18,
	"sex": "male"
}

2.array数组

array数组是使用中括号[ ]括起来的那部分。
数组是一组有序的集合,值之间使用“,”进行分隔。
如:

[
	"data": 1,
	"data": 2,
	"data": 3
]

注意,这里面说的是“值”,这个值是一个比较抽象的概念,不是简单的一个字符串或者是一个数字,下面介绍值。

3.value值

这个值是一个抽象的概念,并不是一个确定的类型,可以是简单的字符串或者是数字,也可以是上面介绍的对象、数组,甚至还可以各种深层次嵌套的东西。

值(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格式数据的介绍。

Qt下操作json格式的数据

第一部分介绍了json的结构,分为对象object、数组array、值value。
鉴于此,在Qt下有三种对于json数据的基本操作,分别为:QJsonObject、QJsonArray、QJsonValue
以及对于解析错误进行描述的类:QJsonParseError(Qt解析错误)。

QJsonObject

因为对象object中有值value,而值value又是一个名称/值对,所以对于QJsonObject来说,可以直接使用QJsonObject::value()来获得指定字段的值。
另外的功能见下图,其中使用最多的就是QJsonObject::value()这个函数:
json介绍及使用QJson操作json格式数据_第1张图片

QJsonValue

因为值value基本上可以是任何的类型,所以值value也可以是对象object、数组array,因此对于QJsonValue而言,可以使用QJsonValue::toObject(),和QJsonValue::toArray()将值value转化为对象object或者是数组array

另外,值value也可以转化为其他的类型,详细内容见下图:
json介绍及使用QJson操作json格式数据_第2张图片

OJsonArray

对于数组array而言,其实可以把它当成Qt中的QVector看待,可以执行添加、删除、插入,还进行了operator操作符的重载操作,拿我来说,我就喜欢直接用下标的方式来进行操作,因为下标在没有这个字段的时候,会自动执行插入操作,相当方便。
具体的函数如下图所示:
json介绍及使用QJson操作json格式数据_第3张图片

例子演示

这里以我的代码来进行表示吧,读写的格式如下方所示:

json格式

//读取格式
{
	"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介绍及使用QJson操作json格式数据_第4张图片
读取结果:
json介绍及使用QJson操作json格式数据_第5张图片
写入之后的文件:
json介绍及使用QJson操作json格式数据_第6张图片
再次读取的结果如下:
json介绍及使用QJson操作json格式数据_第7张图片

总结

掌握json的三个重要结构:对象object、数组array、值value。
Qt操作的三个重要组成:QJsonObject、QJsonArray、QJsonValue
Qt的补充操作:QJsonParseError错误信息类、QJsonDocument文件相关类

另外,就是值value的各种嵌套了,操作上也是这样,代码的读取与写入都是各种值的嵌套操作,只要遵循两者间通信的协议即可,其余可即兴发挥。

参考链接1
参考链接2
参考链接3

你可能感兴趣的:(Qt相关,文本格式,json,Qt)