Qt 框架中的 QJsonArray 和 QJsonObject 的区别

这两个类都是 Qt 用来处理 JSON (JavaScript Object Notation) 数据格式的核心组件。JSON 是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。

1. QJsonObject (JSON 对象)

  • 定义: QJsonObject 代表一个 JSON 对象。在 JSON 规范中,一个对象是一个无序键值对 (key-value pair) 集合。
  • 结构: 类似于 C++ 中的 std::map 或者 Python 中的 dict。它包含一系列的键(必须是字符串)和对应的值。这些值可以是字符串、数字、布尔值 (true/false)、null、另一个 QJsonObject 或者一个 QJsonArray
  • JSON 表示: 在 JSON 文本中,对象通常用花括号 {} 包裹。键和值之间用冒号 : 分隔,键值对之间用逗号 , 分隔。
    {
      "name": "Alice",
      "age": 30,
      "isStudent": false,
      "address": {
        "street": "123 Main St",
        "city": "Anytown"
      },
      "courses": [ "Math", "Physics" ]
    }
    
  • 主要操作:
    • 插入/修改键值对: insert(key, value)
    • 获取值: value(key), operator[](key)
    • 检查是否包含某个键: contains(key)
    • 获取所有键: keys()
    • 删除键值对: remove(key)
  • 特点: 键是唯一的,且集合是无序的(尽管 Qt 的实现可能会保持插入顺序,但不应依赖此特性)。通过**键(字符串)**来访问对应的值。

示例代码 (C++)

#include 
#include 
#include 

int main() {
    QJsonObject jsonObj;
    jsonObj.insert("name", "Bob");               // 插入字符串
    jsonObj.insert("age", 25);                  // 插入数字
    jsonObj.insert("isProgrammer", true);       // 插入布尔值

    QJsonObject address;
    address.insert("city", "Beijing");
    address.insert("zipcode", 100000);
    jsonObj.insert("address", address);        // 插入另一个 QJsonObject

    qDebug() << "Name:" << jsonObj.value("name").toString(); // 通过键访问
    qDebug() << "Age:" << jsonObj["age"].toInt();          // 通过 [] 操作符访问
    qDebug() << "City:" << jsonObj.value("address").toObject().value("city").toString();

    return 0;
}

2. QJsonArray (JSON 数组)

  • 定义: QJsonArray 代表一个 JSON 数组。在 JSON 规范中,一个数组是一个有序的值的列表
  • 结构: 类似于 C++ 中的 std::vector 或者 Python 中的 list。它包含一个值的序列,这些值的类型同样可以是字符串、数字、布尔值、null、QJsonObjectQJsonArray
  • JSON 表示: 在 JSON 文本中,数组通常用方括号 [] 包裹。值之间用逗号 , 分隔。
    [
      "apple",
      100,
      true,
      null,
      { "color": "red" },
      [ 1, 2, 3 ]
    ]
    
  • 主要操作:
    • 追加值: append(value), push_back(value)
    • 在指定位置插入值: insert(index, value)
    • 获取指定位置的值: at(index), operator[](index)
    • 获取数组大小: size(), count()
    • 删除指定位置的值: removeAt(index)
  • 特点: 元素是有序的,可以通过**索引(整数)**来访问。同一个数组中可以包含不同类型的值。

示例代码 (C++)

#include 
#include 
#include 
#include 

int main() {
    QJsonArray jsonArr;
    jsonArr.append("apple");       // 追加字符串
    jsonArr.append(123);           // 追加数字
    jsonArr.append(true);          // 追加布尔值

    QJsonObject fruit;
    fruit.insert("name", "banana");
    fruit.insert("color", "yellow");
    jsonArr.append(fruit);        // 追加 QJsonObject

    qDebug() << "First element:" << jsonArr.at(0).toString();    // 通过索引访问
    qDebug() << "Second element:" << jsonArr[1].toInt();         // 通过 [] 操作符访问
    qDebug() << "Fruit name:" << jsonArr[3].toObject().value("name").toString();
    qDebug() << "Array size:" << jsonArr.size();

    return 0;
}

总结区别:

特性 QJsonObject QJsonArray
JSON 表示 {} (花括号) [] (方括号)
结构 无序的键值对集合 (map/dictionary) 有序的值列表 (vector/list)
访问方式 通过键 (字符串) value(key) 通过索引 (整数) at(index)
顺序 无序 (不保证) 有序 (按插入/索引顺序)
键/索引 键必须是字符串且唯一 索引是整数,从 0 开始

简单来说:

  • 当你需要表示一组具有名称(键)的数据项时,使用 QJsonObject
  • 当你需要表示一个有序的值的列表时,使用 QJsonArray

这两个类可以相互嵌套,用来构建复杂的 JSON 数据结构。例如,一个 QJsonObject 的值可以是一个 QJsonArray,一个 QJsonArray 中的元素也可以是一个 QJsonObject

你可能感兴趣的:(qt,开发语言)