0%

QJsonArray

摘要

  • QJsonArray 类 相关学习笔记

QJsonArray 类 详解

QJsonArray 是 Qt 中用于表示 JSON 数组的类。它提供了一组功能,用于存储和操作 JSON 格式的数组数据,支持操作类似 QList 或标准数组。

以下是 QJsonArray 类的详细介绍:


1. 概述

QJsonArray 表示 JSON 中的数组,可以包含以下类型的元素:

  • QJsonValue::Null
  • QJsonValue::Bool
  • QJsonValue::Double
  • QJsonValue::String
  • QJsonValue::Array
  • QJsonValue::Object

一个 QJsonArray 实例可以存储任意数量的 JSON 值,并允许动态操作。


2. 构造函数

  • 默认构造函数:

    1
    QJsonArray();

    创建一个空的 JSON 数组。

  • 拷贝构造函数:

    1
    QJsonArray(const QJsonArray &other);

    创建一个与 other 相同的 JSON 数组。

  • 析构函数:

    1
    ~QJsonArray();

3. 常用方法

3.1 元素操作

  • 添加元素:

    1
    void append(const QJsonValue &value);

    value 添加到数组的末尾。

  • 插入元素:

    1
    void insert(int i, const QJsonValue &value);

    在索引 i 处插入 value

  • 替换元素:

    1
    void replace(int i, const QJsonValue &value);

    替换索引 i 处的元素为 value

  • 访问元素:

    1
    2
    3
    QJsonValue at(int i) const;
    QJsonValue operator[](int i) const;
    QJsonValueRef operator[](int i);
  • 移除元素:

    1
    void removeAt(int i);
  • 清空数组:

    1
    void clear();

3.2 查询与检查

  • 获取大小:

    1
    int size() const;
  • 检查是否为空:

    1
    bool isEmpty() const;
  • 检查是否包含特定值:

    1
    bool contains(const QJsonValue &value) const;
  • 查找值的索引:

    1
    int indexOf(const QJsonValue &value) const;

3.3 遍历数组

  • 获取数组中的所有值:

    1
    QList<QJsonValue> toVariantList() const;
  • 使用迭代器遍历:

    1
    2
    3
    for (auto it = jsonArray.begin(); it != jsonArray.end(); ++it) {
    QJsonValue value = *it;
    }
  • 基于范围的 for 循环:

    1
    2
    3
    for (const QJsonValue &value : jsonArray) {
    // 使用 value
    }

3.4 其他方法

  • 将 JSON 数组转换为字符串:

    1
    QString toString() const;
  • 将数组转换为 QVariantList

    1
    QVariantList toVariantList() const;

4. 示例代码

4.1 创建与操作 JSON 数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <QJsonArray>
#include <QJsonValue>
#include <QDebug>

int main() {
// 创建 JSON 数组
QJsonArray jsonArray;
jsonArray.append(42);
jsonArray.append("Hello");
jsonArray.append(true);

// 插入新元素
jsonArray.insert(1, QJsonValue(3.14));

// 替换元素
jsonArray.replace(0, QJsonValue("Replaced"));

// 遍历数组
for (const QJsonValue &value : jsonArray) {
qDebug() << value;
}

// 输出数组大小
qDebug() << "Array size:" << jsonArray.size();

// 转换为字符串
qDebug() << "JSON Array:" << jsonArray;

return 0;
}

输出:

1
2
3
4
5
6
"Replaced"
3.14
"Hello"
true
Array size: 4
JSON Array: ["Replaced",3.14,"Hello",true]

4.2 嵌套 JSON 数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <QJsonArray>
#include <QJsonObject>
#include <QDebug>

int main() {
// 创建嵌套 JSON 数据
QJsonArray jsonArray;

// 添加简单值
jsonArray.append(100);
jsonArray.append("Qt");

// 添加 JSON 对象
QJsonObject jsonObject;
jsonObject.insert("name", "Alice");
jsonObject.insert("age", 25);
jsonArray.append(jsonObject);

// 添加嵌套数组
QJsonArray nestedArray;
nestedArray.append(1);
nestedArray.append(2);
nestedArray.append(3);
jsonArray.append(nestedArray);

// 转换为 JSON 字符串
qDebug() << "JSON Array:" << QJsonDocument(jsonArray).toJson(QJsonDocument::Indented);

return 0;
}

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
[
100,
"Qt",
{
"age": 25,
"name": "Alice"
},
[
1,
2,
3
]
]

4.3 从 JSON 字符串解析数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonValue>
#include <QDebug>

int main() {
// JSON 字符串
QByteArray jsonString = R"([42, "Qt", true, [1, 2, 3]])";

// 从字符串解析 JSON
QJsonDocument doc = QJsonDocument::fromJson(jsonString);
QJsonArray jsonArray = doc.array();

// 遍历解析后的数组
for (const QJsonValue &value : jsonArray) {
if (value.isArray()) {
QJsonArray nestedArray = value.toArray();
qDebug() << "Nested Array:" << nestedArray;
} else {
qDebug() << value;
}
}

return 0;
}

输出:

1
2
3
4
42
"Qt"
true
Nested Array: [1,2,3]

5. 注意事项

  1. 数组索引: 如果访问超出索引范围,会返回默认的 QJsonValue::Null
  2. 动态扩展: QJsonArray 的大小会根据插入的元素动态调整。
  3. 类型检查: 使用 QJsonValue 的类型检查方法(如 isObject, isArray 等)确保操作的值类型正确。

QJsonArray 是处理 JSON 数组的核心类,结合 QJsonObjectQJsonDocument 可以构建复杂的 JSON 数据结构并高效管理它们。

感谢老板支持!敬礼(^^ゞ