全国咨询/投诉热线:400-618-4000

C/C++:教你快速搞定Qt下的Json文件使用

更新时间:2018年01月24日14时35分 来源:传智播客 浏览次数:

JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。JSON 解析器和 JSON 库支持许多不同的编程语言,目前非常多的编程语言都支持JSON。接下来传智播客C/C++培训专家为大家介绍一下Qt下的Json的使用。

Json的两种结构

JSON有两种表示结构,对象和数组。

l 对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。

{

key1:value1,

key2:value2,

...

}

其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组。

l 数组结构以”[”开始,”]”结束。中间由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文档类主要是把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类型的属性,我们必须通过该对象判断该类型的实际类型,然后在将其转换为对应的数据类型:

] 类型判断相关的成员方法:

n bool isArray() const // 是否为json数组

n bool isBool() const // 是否为布尔类型

n bool isDouble() const // 是否为浮点类型

n bool isNull() const // 是否为空

n bool isObject() const // 是否为json对象

n bool isString() const // 是否为字符串类型

] 数据类型转换相关成员方法:

n QJsonArray toArray(const QJsonArray &defaultValue) const

n QJsonArray toArray() const // 转为为json数组

n bool toBool(bool defaultValue = false) const // to布尔类型

n double toDouble(double defaultValue = 0) const

n int toInt(int defaultValue = 0) const

n QJsonObject toObject(const QJsonObject &defaultValue) const

n QJsonObject toObject() const // 转换为json对象

n 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++培训专家就给大家分享到这里,希望大家多多练习,祝大家学习愉快!

本文版权归传智播客C/C++学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客C/C++学院
首发:http://www.itcast.cn/c/

javaee

python

web

ui

cloud

test

c

netmarket

pm

Linux

movies

robot

uids

北京校区

    14天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    20天免费试学

    基础班入门课程限时免费

    申请试学名额

    8天免费试学

    基础班入门课程限时免费

    申请试学名额

    20天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    0天免费试学

    基础班入门课程限时免费

    申请试学名额

    12天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    10天免费试学

    基础班入门课程限时免费

    申请试学名额