传智播客C/C++培训专家:教你快速搞定Qt下的Json文件使用
JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。JSON 解析器和JSON 库支持许多不同的编程语言,目前非常多的编程语言都支持JSON。接下来传智播客C/C++培训专家为大家介绍一下Qt下的Json的使用。
Json的两种结构
JSON有两种表示结构,对象和数组。
对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。
{
key1:value1,
key2:value2,
...
}
其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组。
数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。
[
true,
123,
“hello,world”
]
数组中的元素值类型可以相同也可不同。
Json格式的文件在使用的时候是十分灵活的,其中数组和对象之间也是可以相互嵌套的,大家可以按照自己的实际需求来定义成对应的格式。例如:
[
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName": "Jones" }
]
Qt5中JSON的生成与解析
Qt5 新增加了处理JSON 的类,与XML 类库类似,均以QJson 开头,在QtCore 模块中,不需要额外引入其它模块。Qt5 新增加六个
相关类:
类类说明
QJsonDocument 读写JSON 文档
QJsonObject 封装JSON 对象
QJsonArray 封装JSON 数组
QJsonValue 封装JSON 值QJsonObject::iterator 用于遍历QJsonObject 的STL 风格的非
const 遍历器
QJsonParseError 报告JSON 处理过程中出现的错误
需要大家着重掌握的类为前四个。
QJsonDocument
该Json文档类主要是把json格式的数据解析为Qt中的Json文档对象,所有我们在使用该类之前,需要先把数据准备好:
解析Json
1.使用QFile对象加载指定的Json格式文件
a)QFile file(”D:\\myjson.json”);
b)file.open(QIODevice::ReadWrite);
2.通过QFile类中的read方法将文件数据读到内存
a)QByteArray json = file. readAll();
3.QJsonDocument::fromJson() 可以由QByteArray 对象构造一
QJsonDocument 对象,用于我们的读写操作
a)QJsonDocument jsDoc;
b)jsDoc = QJsonDocument::fromJson(json.toUtf8()); QJsonObject
生成json对象
因为json对象为键值对,所以我们可以使用QJsonObject类的insert方法,向该类对象中插入数据。
1.创建空的QJsonObject对象
a)QJsonObject obj;
2.使用insert方法向空对象中插入数据
a)obj.insert(“name”, “Jack”);
b)obj.insert(“age”, 26);
c)obj.insert(“isboy”, true);
解析json对象
1.首先需要先得到一个QJsonDocument对象,然后判断该对象是
否是一个json对象,使用isObject()方法
2.使用QJsonDocument类的object()方法可以将json文档对象
转换为Json对象。
3.可以通过QJsonObject对象的key值得到其value值,访问方式
为QJsonValue value = obj[key]
4.使用QJsonValue类的成员方法将value值转换为实际的数据类
型。
QJsonDocument parse_doucment;
parse_doucment = QJsonDocument::fromJson(byte_array);
if(parse_doucment.isObject())
{
QJsonObject obj = parse_doucment.object();
if(obj.contains("name"))
{
QJsonValue name_value = obj["name"];
if(name_value.isString())
{
QString name = name_value.toString();
}
}
QJsonArray
生成Json
1.创建Json数组:
a)QJsonArray json;
2.使用QJsonArray类的insert方法插入数据:
a)json.insert(0, QString("Qt"));
b)json.insert(1, QString("version"));
c)json.insert(2, true);
3.创建Json文档对象:
a)QJsonDocument document;
4.将初始化完成的json数组对象设置给Json文档对象
a)document.setArray(json);
5.将json文档对象转换为QByteArray对象
a)QByteArray byte_array = document.toJson();
生成的文件格式:["Qt","version",true]
解析Json
1.首先需要先得到一个QJsonDocument对象,然后判断该对象是
否是一个json数组,使用isArray()方法。
2.使用QJsonDocument类的array()方法可以将json文档对象
转换为Json对象。
3.可以通过QJsonArray对象遍历得到其中的每个value值,访问
方式与遍历普通数组的方式相同。
4.使用QJsonValue类的成员方法将value值转换为实际的数据类
型。
QJsonDocument parse_doucment;
parse_doucment = QJsonDocument::fromJson(byte_array); if(parse_doucment.isArray())
{
QJsonArray array = parse_doucment.array();
int size = array.size();
for(int i=0; i { QJsonValue value = array.at(i); if(value.isString()) { QString name = value.toString(); } else if(value.isBool()) { bool flag = value.toBool(); } } } QJsonValue 在使用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 // 是否为字符串类型 数据类型转换相关成员方法: ?QJsonArray toArray(const QJsonArray &defaultValue) const ?QJsonArray toArray() const // 转为为json数组 ?bool toBool(bool defaultValue = false) const // to布尔类型 ?double toDouble(double defaultValue = 0) const ?int toInt(int defaultValue = 0) const ?QJsonObject toObject(const QJsonObject &defaultValue) const ?QJsonObject toObject() const // 转换为json对象 ?QString toString(const QString &defaultValue = QString()) const 生成Json 1.创建JsonObject对象或数组(再次以对象举例) a)QJsonObject json; 2.往json对象中添加键值对 a)json.insert("name", QString("Qt")); b)json.insert("version", 5); c)json.insert("windows", true); 3.创建Json文档对象 a)QJsonDocument document; 4.将Json对象或数组设置给json文档对象 a)document.setObject(json); // 数组:setArray(array) 5.将文档对象转换为QByteArray类型的数据 a)QByteArray byte_array = document.toJson(); 6.将该数据通过QFile对象保存为磁盘文件。 最终格式:{"name": "Qt","version": 5,"windows": true} 好了,今天的的知识点,传智播客C/C++培训专家就给大家分享到这里,希望大家多多练习,祝大家学习愉快!