Qt 操作Json格式文件(创建、插入、解析、修改、删除)_qjsonobject 打开 追加

[ "black", "white" ],
[ "red", "greed" ]

]

 代码实现上述效果:

 

// 定义 [ ] 对象
QJsonArray colorArray;

// 定义 [ ] 对象
QJsonArray colorArray1;
// 往数组中添加元素
colorArray1.append(“black”);
colorArray1.append(“white”);

// 定义 [ ] 对象
QJsonArray colorArray2;
// 往数组中添加元素
colorArray2.append(“red”);
colorArray2.append(“greed”);

colorArray.append(colorArray1);
colorArray.append(colorArray2);



把代码写好后,编译运行,会在自己的项目路径中创建一个JSON文件,并写入内容,文件内容如下:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703153906700.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NwcF9sZWFybmVy,size_16,color_FFFFFF,t_70#pic_center)  
 顺序可能有点乱,但是不妨碍我们阅读与下面解析!




---


## 三、解析Json


解析根据上图进行!


在使用JSON对象或者JSON数组对象得到对应的value之后,该value值并不是最总的数据类型,而是一个QJsonValue类型的属性,我们必须通过该对象判断该类型的实际类型,然后在将其转换为对应的数据类型。  
 可以使用下面表格的方法,也可以使用代码中的方法进行判断,  
 类型判断相关成员方法:




| 方法 | 解释 |
| --- | --- |
| bool **isArray**() const | 是否为json数组 |
| bool **isBool**() const | 是否为布尔类型 |
| bool **isDouble**() const | 是否为浮点类型 |
| bool **isNull**() const | 是否为空 |
| bool **isObject**() const | 是否为json对象 |
| bool **isString**() const | 是否为字符串类型 |


1. 打开文件,读取全部内容

 

QFile file(“…/Json/js.json”);
if (!file.open(QFile::ReadOnly | QFile::Text)) {
qDebug() << “can’t open error!”;
return;
}

// 读取文件的全部内容
QTextStream stream(&file);
stream.setCodec(“UTF-8”); // 设置读取编码是UTF8
QString str = stream.readAll();

file.close();

 注意编码啊!
2. 将字符串解析成QJsonDocument对象

 

// QJsonParseError类用于在JSON解析期间报告错误。
QJsonParseError jsonError;
// 将json解析为UTF-8编码的json文档,并从中创建一个QJsonDocument。
// 如果解析成功,返回QJsonDocument对象,否则返回null
QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(), &jsonError);
// 判断是否解析失败
if (jsonError.error != QJsonParseError::NoError && !doc.isNull()) {
qDebug() << “Json格式错误!” << jsonError.error;
return;
}

3. 获取根 { }

 

QJsonObject rootObj = doc.object();

4. 根据键获取值

 

// 根据键获取值
QJsonValue nameValue = rootObj.value(“name”);
qDebug() << "name = " << nameValue.toString();

QJsonValue ageValue = rootObj.value(“age”);
qDebug() << "age = " << ageValue.toInt();
// 解析 bool类型
QJsonValue vipValue = rootObj.value(“vip”);
qDebug() << "vip = " << vipValue.toBool();

// 解析 null类型
QJsonValue addressValue = rootObj.value(“address”);
if (addressValue.type() == QJsonValue::Null) {
qDebug() << "address = " << “null”;
}

5. 解析对象 { }  
 也就是解析下图内容:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703155739971.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NwcF9sZWFybmVy,size_16,color_FFFFFF,t_70#pic_center)

 解析代码:

 

QJsonValue interestValue = rootObj.value(“interest”);
// 判断是否是object类型
if (interestValue.type() == QJsonValue::Object) {
// 转换为QJsonObject类型
QJsonObject interestObj = interestValue.toObject();

QJsonValue basketballValue = interestObj.value("basketball");
qDebug() << "basketball = " << basketballValue.toString();
QJsonValue badmintonValue = interestObj.value("badminton");
qDebug() << "badminton = " << badmintonValue.toString();

}

 通过value函数根据键获取到一个QJsonValue 类型数据,然后进行判断是否是对应类型,然后转换成对应类型,就可以使用value函数进行获取QJsonValue值,再转换类型就可以拿到数据了。
6. 解析数组 [ ]  
 也就是解析下图内容:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703155704479.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NwcF9sZWFybmVy,size_16,color_FFFFFF,t_70#pic_center)  
 解析代码:

 

QJsonValue colorValue = rootObj.value(“color”);
// 判断是否是Array类型
if (colorValue.type() == QJsonValue::Array) {
// 转换为QJsonArray类型
QJsonArray colorArray = colorValue.toArray();

for (int i = 0; i < colorArray.size(); i++) {
	QJsonValue color = colorArray.at(i);
	qDebug() << "color = " << color.toString();
}

}

7. 解析数组中的对象 [ { } ]  
 也就是解析下图内容:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703160103999.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NwcF9sZWFybmVy,size_16,color_FFFFFF,t_70#pic_center)  
 解析代码:

 

// 根键获取值
QJsonValue likeValue = rootObj.value(“like”);
// 判断类型是否是数组类型
if (likeValue.type() == QJsonValue::Array) {
// 转换成数组类型
QJsonArray likeArray = likeValue.toArray();
// 遍历数组
for (int i = 0; i < likeArray.count(); i++) {
// 获取数组的第一个元素,类型是QJsonValue
QJsonValue likeValueChild = likeArray.at(i);
// 判断是不是对象类型
if (likeValueChild.type() == QJsonValue::Object) {
// 转换成对象类型
QJsonObject likeObj = likeValueChild.toObject();
// 最后通过value函数就可以获取到值了,解析成功!
QJsonValue gameLikeValue = likeObj.value(“game”);
qDebug() << "game = " << gameLikeValue.toString();
QJsonValue priceLikeValue = likeObj.value(“price”);
qDebug() << "price = " << priceLikeValue.toDouble();
}
}
}

8. 解析 对象 中 对象 { { } }  
 也就是解析下图内容:  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210703160544318.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NwcF9sZWFybmVy,size_16,color_FFFFFF,t_70#pic_center)  
 解析代码:

 

//

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值