alin的学习之路: Json简介和Qt中的Json相关类和函数
JSON
(JavaScrip Object Notation)
是一种轻量级的数据交换格式
。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据
。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。总结:
- Json是一种数据格式, 不是语言, 与语言无关
使用Json主要是用于数据的网络传输, 或者数据的持久化操作(写磁盘文件)
1. Json格式
Json有两种格式:
Json数组
,Josn对象
, 这两种格式可以相互嵌套使用Json格式的文件一般使用的文件后缀为:
.json
- 在一个Json文件中, 最顶层的结构只能有一个(
要么是数组要么是对象
), 不能并列出现
- 内部可以嵌套或者并列, 但是顶层结构只能出现一种结构
-
Json数组
// 语法: Json数组使用 []表示, 匿名的, 里边的元素之间以逗号间隔, 最后一个元素后边没有逗号 // 在一个Josn数组中可以同时出现多种类型的元素: // - 整形, 浮点型, 字符串, 布尔类型, NULL, Json数组, Json对象 // 举例: [12, 12.34 "hello,world", true, false, NULL, [1,2], {"hello":"world"}]
-
Json对象
// 语法: Json对象是使用 {} 来表示, 匿名的, 里边的每一个元素是一个键值对 (key-value) // 元素和元素之间使用逗号间隔, 最后一个元素后边没有逗号 // 对于每个键值对来说 (key 和 value之间使用冒号间隔): // - key: 必须是字符串类型, key就是对valie值的描述 // - value: 整形, 浮点型, 字符串, 布尔类型, NULL, Json数组, Json对象 // 举例: 描述一个人的信息 { "ID":123, "Name":"张三", "Sex":"man", "Age":23.5, "Family":{ "Father":"杨过", "Mother":"小龙女", "Sister":["小红", "小绿"] }, "IsMarried":true }
2. Qt中的Json操作
QT中提供的Json操作类一共有4个:
QJsonValue
- 对Json支持的数据类型进行了包装, 得到了一个新的同一的类型
QJsonObject
- Json对象操作类
QJsonArray
- Json数组的操作类
QJsonDocument
- Json文档对象, 类型转换
- json数组/对象[
内存中的一数据块, 不是字符串
] -> 字符串- 字符串 -> json数组/对象
-
QJsonValue
- 将json支持的数据类型进行封装 -> 统一的类型
- 如果判断这个对象中存储了什么类型的数据呢?
- 如何通过这个对象得到实际的数据类型?
-
QJsonObject
-> 封装了json的对象// 如何创建json对象 QJsonObject::QJsonObject(); // 构造空对象 // 如何将键值对添加到空对象中 iterator QJsonObject::insert(const QString &key, const QJsonValue &value); // 如何知道对象中键值对个数 int QJsonObject::count() const; int QJsonObject::size() const; int QJsonObject::length() const; // 遍历 // 1. 使用相关的迭代器函数 // 2. 使用 [] 的方式遍历, 类似于遍历数组, []中是键值 // 3. 先得到对象中所有的键值, 在遍历键值列表, 通过key得到value值 QStringList QJsonObject::keys() const; // 通过key得到value QJsonValue QJsonObject::value(const QString &key) const; // utf8 QJsonValue QJsonObject::value(QLatin1String key) const; // 字符串不支持中文 QJsonValue QJsonObject::operator[](const QString &key) const; QJsonValue QJsonObject::operator[](QLatin1String key) const; // 删除键值对 void QJsonObject::remove(const QString &key); QJsonValue QJsonObject::take(const QString &key); // 返回key对应的value值 // 通过key进行查找 iterator QJsonObject::find(const QString &key); bool QJsonObject::contains(const QString &key) const;
-
QJsonArray
// 得到空的数组对象 QJsonArray::QJsonArray(); // 添加数据 void QJsonArray::append(const QJsonValue &value); // 在尾部追加 void QJsonArray::insert(int i, const QJsonValue &value); // 插入到 i 的位置之前 iterator QJsonArray::insert(iterator before, const QJsonValue &value); void QJsonArray::prepend(const QJsonValue &value); // 添加到数组头部 void QJsonArray::push_back(const QJsonValue &value); // 添加到尾部 void QJsonArray::push_front(const QJsonValue &value); // 添加到头部 // 计算数组原始个数 int QJsonArray::count() const; int QJsonArray::size() const; // 取值 QJsonValue QJsonArray::at(int i) const; QJsonValue QJsonArray::first() const; // 头部元素 QJsonValue QJsonArray::last() const; // 尾部元素 QJsonValueRef QJsonArray::operator[](int i); // 删除 iterator QJsonArray::erase(iterator it); void QJsonArray::pop_back(); // 删除尾部 void QJsonArray::pop_front(); // 删除头部 void QJsonArray::removeAt(int i); // 删除i位置的元素 void QJsonArray::removeFirst(); // 删除头部 void QJsonArray::removeLast(); // 删除尾部 QJsonValue QJsonArray::takeAt(int i); // 删除i位置的原始, 并返回删除的元素的值
-
QJsonDocument
QJsonObject 和 QJsonArray
这两个对象中的数据是不能直接转换为 字符串类型的- 如果要进行数据传输, 数据的持久化, 操作的都是字符串类型 而不是
QJsonObject 和 QJsonArray
类型 - 需要通过一个Json文档类进行二者之间的转换
QJsonObject 和 QJsonArray
---->字符串
字符串
—>QJsonObject 和 QJsonArray
-
QJsonObject 和 QJsonArray
---->字符串
// 1. 创建QJsonDocument对象 QJsonDocument::QJsonDocument(const QJsonObject &object); QJsonDocument::QJsonDocument(const QJsonArray &array); // 2. 将文件对象中的数据进行序列化 QByteArray QJsonDocument::toBinaryData() const; // 二进制格式的json字符串 QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const; // 文本格式 // 3. 使用得到的字符串进行数据传输, 或者磁盘文件持久化
-
字符串
—>QJsonObject 和 QJsonArray
// 将磁盘/网络通信得到的json字符串 -> json对象/json数组 // 1. 将得到的json格式字符串 ---> json文档对象 // 通过 QJsonDocument 类的静态函数 [static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate) // 参数文件格式的json字符串 [static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR) // 2. 将文档对象转换为json数组/对象 // 判断文档对象中存储的数据是不是数组 bool QJsonDocument::isArray() const; // 判断文档对象中存储的数据是不是json对象 bool QJsonDocument::isObject() const // 文档对象中的数据转换为json对象 QJsonObject QJsonDocument::object() const; // 文档对象中的数据转换为json数组 QJsonArray QJsonDocument::array() const; // 3. QJsonArray , QJsonObject 类提供的 api 解析得到 里边存储的数据
- 如果要进行数据传输, 数据的持久化, 操作的都是字符串类型 而不是