Qt读写Json文件

Qt读取Json文件

一、示例Json文件内容

下方为本文所使用的Json文件的内容,其中包含字符串、数值、布尔、null、对象、数组、组合类型等(读取方式在本文第三节)

{
	"str": "strVal",
	"number": 88,
	"bool": true,
	"null": null,

	"object": {
		"key1": "Val1",
		"key2": "Val2",
		"key3": "Val3"
	},

	"array": [
		"elem1",
		"elem2",
		"elem3",
		"elem4"
	],

	"combination": [{
			"name": "Google",
			"url": "http://www.google.com"
		},

		{
			"name": "Baidu",
			"url": "http://www.baidu.com"
		},

		{
			"name": "SoSo",
			"url": "http://www.SoSo.com"
		}
	]
}

二、Json读取会使用的类(介绍读取所使用的类在本文中的作用,个人理解)

QJsonParseError:用于报告JSON解析期间的错误;当JSON串格式有问题时会存储错误
QJsonDocument:提供了一种读取和写入JSON文档的方法;
QJsonObject:用于读取对象类型数据和接收从QJsonDocument对象中获取的QJsonObject对象
QJsonArray:用于读取数组类型数据

三、Json文件的读取

3.1 读取Json串到QByteArray中

QFile file("./jsonTest.json");	//创建QFile对象,并指定json文件路径
//打开json文件并判断(不成功则返回0)
if(!file.open(QIODevice::ReadOnly))
    return 0;
//将文件内容读取到数组中
QByteArray data(file.readAll());
file.close();	//关闭文件

3.2 读取Json串到QJsonDocument,并使用QJsonParseError判断是否有错

QJsonParseError jError;	//创建QJsonParseError对象
//使用QJsonDocument的fromJson函数读取json串,并将QJsonParseError对象传入获取错误值
QJsonDocument jDoc = QJsonDocument::fromJson(data, &jError);	
//判断QJsonParseError对象获取的error是否包含错误,包含则返回0
if(jError.error != QJsonParseError::NoError)
    return 0;

3.3 获取QJsonObject,并读取Json串中各类型的值

获取QJsonObject对象

QJsonObject jObj = jDoc.object();

获取常规类型的值

//读取字符串
QString strVal = jObj["str"].toString();
//读取数值(对应的数值转换成对应的类型)
int numVal = jObj["number"].toInt();
//读取逻辑值
bool boolVal = jObj["bool"].toBool();
//读取空值(因其没有对应的to类型函数,可使用下方类型接收或isNull()函数判断)
QVariant nullVal = jObj["null"].toVariant();

获取对象类型及其中的值

//对象类型需要使用新的QJsonObject对象存放,然后使用新的QJsonObject获取其中值
QJsonObject jObj2 = jObj["object"].toObject();
//获取jObj2中指定键的值(值对应的类型直接使用对应函数转)
QString key1Val = jObj2["key1"].toString();

获取数组类型及其中的值

//对象类型需要使用QJsonArray对象存放
QJsonArray jArr = jObj["array"].toArray();
//获取jArr中指定下标的值(该值可通过如下方式接收或使用QJsonValue的对象接收)
QString arr1Val = jArr.at(0).toString();

读取组合类型的值

//组合对象第一层类型为数组,需要使用QJsonArray对象存放
QJsonArray jArr2 = jObj["combination"].toArray();
//数组中存放的对象,使用QJsonObject接收
QJsonObject jObj3 = jArr2.at(0).toObject();
//获取对象中的指定键的值
QString name = jObj3["name"].toString();

总结

建议学习前先了解一下Json文件格式,其次为在编写代码的过程中需要细心,类似的对象名容易混淆

一、示例Json文件内容

下方为本文所使用的Json文件的内容,其中包含字符串、数值、布尔、null、对象、数组等(写入方式在本文第三节)

{
    "array": [
        "str",
        88,
        null
    ],
    "bool": true,
    "jChildObj": {
        "age": 25,
        "name": "tom"
    },
    "null": null,
    "number": 66,
    "str": "String"
}

二、Json写入会使用的类

QJsonDocument:使用其提供的toJson函数获取json串
QJsonObject:创建用于存储所有类型的根对象,和创建对象类型的变量
QJsonArray:用于创建数组变量,并存放数组数据

三、Json文件的写入

3.1 常规类型的写入
创建根对象(QJsonObject)

//创建QJsonObject对象(姑且称之为根对象),用于存放需要写入的数据
QJsonObject jObj;

常规对象的添加

//添加字符串类型
jObj.insert("str", "String");

//添加数值类型(在值为具体值时其中的QJsonValue可以不使用,直接放入值本身)
jObj.insert("number", QJsonValue(66));

//添加布尔类型
jObj.insert("bool", true);

//添加空值(直接放一个QJsonValue对象即可,不传入值时默认为空)
jObj.insert("null", QJsonValue());

3.2 对象及数组类型的添加
对象类型

//对象类型需要一个子QJsonObject对象存放,然后在添加到根QJsonObject对象中
QJsonObject jChildObj;
//添加值时直接使用如上方法添加具体值即可
jChildObj.insert("name", "tom");
jChildObj.insert("age", 25);

//当子对象的值添加完成后将子对象添加到根对象中即可
jObj.insert("jChildObj", jChildObj);

数组类型

//创建数组对象
QJsonArray array;
//QJsonArray容器和普通容器的添加方法一样,都可调用append函数
array.append("str");
array.append(88);
array.append(QJsonValue());
//数组中元素添加完成后将其添加到根对象中
jObj.insert("array", array);

3.3 Json串写入文件

//创建QJsonDocument对象并将根对象传入
QJsonDocument jDoc(jObj);
//打开存放json串的文件
QFile file("./jsonTest2.json");
if(!file.open(QIODevice::WriteOnly))
    return 0;
//使用QJsonDocument的toJson方法获取json串并保存到数组
QByteArray data(jDoc.toJson());
//将json串写入文件
file.write(data);
file.close();

总结
建议学习前先了解一下Json文件格式,组合类型只需将需要的类型添加到存放的类型中即可

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值