JSON(JavaScript Object Notation)是一种轻量级的结构化数据格式,相对于XML语法更简洁。它具有6种基本数据类型:bool(true或false字符串表示)、double(对应JS中number)、string、array(值的列表)、object(键值对集合)、null 。
虽然cJSON和JsonCpp也是常用的C/C++ JSON解析器,但是在Qt框架中一般用Qt提供的解析类就行了。本文主要介绍QJson的使用,以及使用QTreeView展示和编辑JSON文档(代码链接在最后)。
目录
1.了解QJson
2.解析JSON
3.生成JSON
4.利用QTreeView展示和编辑JSON
5.参考
《偶然》 ----徐志摩
我是天空里的一片云, 偶尔投影在你的波心── 你不必讶异, 更无须欢喜── 在转瞬间消灭了踪影。 你我相逢在黑夜的海上, 你有你的,我有我的,方向; 你记得也好, 最好你忘掉 在这交会时互放的光亮!
1.了解QJsonQt提供了多个类来分别表示JSON文档、节点、迭代器,这些类都是隐式共享的。
QJsonDocument:用于读写JSON文档。它包装完整的JSON文档,并且可以从基于UTF-8编码的文本表示形式以及Qt自己的二进制格式读取和写入此文档。可以使用QJsonDocument::fromJson() 将JSON文档从其基于文本的表示形式转换为QJsonDocument.toJson() 将其转换回文本。
QJsonParseError:用于表示JSON解析时发生的错误。
QJsonObject:表示键值对列表,其中键是唯一的字符串,而值由QJsonValue表示。QJson还提供了iterator和const_iterator来对QJsonObject进行迭代。要注意的是,一般的JSON结构,object键值对列表是无序的,array才有序,QJSON实现没有提供object有序的设置。
QJsonArray:表示值的列表,值由QJsonValue表示。
QJsonValue:存储数据的值,具有六种基本类型,可通过type() 方法获取其类型枚举:Bool、Double、String、Array、Object、Null,外加一个Undefined表示不确定的值。
在使用这些类时,先添加上对应的头文件。
2.解析JSON一般常用的操作是读取文件用QByteArray初始化一个QJsonDocument,或者接收来自Http的object、array。下面的代码操作步骤为:读取文件,解析为QJsonDocument,遍历其中的QJsonObject和QJsonArray并获取值。操作起来相当的简单。
#include
#include
#include
#include
#include
#include
#include
//读取并解析JSON文档
bool LoadJson(const QString &filepath)
{
//判断路径以及是否正常打开
if(filepath.isEmpty())
return false;
QFile file(filepath);
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
return false;
//读取数据后关闭文件
const QByteArray raw_data=file.readAll();
file.close();
//解析为Json文档
QJsonParseError json_error;
QJsonDocument json_doc=QJsonDocument::fromJson(raw_data,&json_error);
//是否正常解析Json数据
if(json_doc.isNull()||json_doc.isEmpty()||json_error.error!=QJsonParseError::NoError)
return false;
//判断是object{}还是array[]的Json
if(json_doc.isObject()){
//解析文档中的Object
const QJsonObject json_obj=json_doc.object();
//[1]可以遍历object
QJsonObject::const_iterator iter;
for (iter = json_obj.constBegin(); iter != json_obj.constEnd(); ++iter){
qDebug(){0,key},{1,"[Object]"}},JsonTreeItem::Object,item);
item-appendChild(child);
//遍历Object的keys
const QStringList keys=obj.keys();
for(const QString &item_key:keys){
//qDebug(){0,key},{1,"[Array]"}},JsonTreeItem::Array,item);
item-appendChild(child);
//遍历Array
for(int i=0;i{0,key},{1,the_val}},JsonTreeItem::Value,item);
item-appendChild(child);
}
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?