JSON以及Json在Qt中的使用

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,但是它是语言无关的,很多编程语言都支持JSON格式的数据交换。


JSON的一些基本特性:

  1. 键值对:JSON数据由键值对组成,键和值之间用冒号(:)分隔。

  2. 数据类型:JSON支持以下几种数据类型:

    • 字符串(String):用双引号(")包围。

    • 数字(Number)。

    • 布尔值(Boolean):truefalse

    • 数组(Array):用方括号([])包围的有序集合。

    • 对象(Object):用花括号({})包围的无序集合,可以包含多个键值对。

    • null

  3. 数组:数组可以包含不同类型的值,数组中的元素用逗号(,)分隔。

    ["JavaScript", "Python", "C++"]
  4. 嵌套对象可以包含数组,数组也可以包含对象,形成嵌套结构。

  5. 格式要求

    • JSON的属性名必须用双引号包围。

    • 属性名和属性值之间用冒号分隔。

    • 数组和对象内部的元素之间用逗号分隔。

    • 数组和对象自身用方括号[]和花括号{}包围。

  6. 大小写敏感:JSON的键名是大小写敏感的。

  7. 解析和生成:许多编程语言提供了解析JSON和生成JSON格式数据的库。

以下是一个简单的JSON示例:

{
  "name": "John Doe",
  "age": 30,
  "isEmployed": true,
  "skills": ["JavaScript", "Python", "C++"],
  "address": {
    "street": "123 Main St",
    "city": "Anytown",
    "zip": "12345"
  }
}

在JSON中,有两种基本的数据结构:对象(Object)和数组(Array)。

JSON对象

JSON对象是一个无序的键值对集合。每个键(key)是一个字符串,而值(value)可以是字符串、数字、数组、布尔值、null或者另一个JSON对象。键和值之间用冒号分隔,键值对之间用逗号分隔。对象由花括号{}包围。

示例

{
  "name": "John Doe",
  "age": 30,
  "isEmployed": true,
  "address": {
    "street": "123 Main St",
    "city": "Anytown",
    "zip": "12345"
  }
}

在这个示例中,nameageisEmployed是键,它们对应的值分别是字符串"John Doe"、数字30和布尔值trueaddress也是一个键,其值是一个嵌套的JSON对象。

JSON数组

JSON数组是一个有序的值集合。数组中的值可以是字符串、数字、对象、数组、布尔值或null。数组由方括号[]包围,数组中的值之间用逗号分隔。

示例

[
  "Apple",
  "Banana",
  "Cherry",
  {"name": "Durian", "stock": 30}
]

在这个示例中,数组包含了三个字符串和一个JSON对象。这个对象表示库存中的一个水果,具有namestock两个键。

区别和用途

  • 结构:JSON对象由键值对组成,适合表示具有多个属性的数据;JSON数组由有序的值组成,适合表示列表或序列。

  • 用途:对象通常用于存储记录或实体的属性,而数组用于存储一系列数据项,如列表、集合或队列。

  • 访问方式:对象通过键来访问值,数组通过索引来访问元素。


Json在Qt中的使用

Qt 框架中处理JSON数据的目的:
  1. 数据交换

    • JSON是一种广泛使用的数据交换格式,Qt应用程序常常需要与其他系统或服务交换数据,使用JSON可以简化这一过程。

  2. 网络通信

    • 在进行网络请求和响应时,JSON是常用的数据格式,Qt应用程序可以通过网络API发送和接收JSON格式的数据。

  3. 配置文件

    • JSON可以作为应用程序的配置文件格式,因为它易于阅读和编写,同时也易于程序解析。

  4. 本地存储

    • 应用程序可以使用JSON格式在本地存储数据,如用户设置、游戏状态等。

  5. 数据序列化和反序列化

    • JSON提供了一种将数据结构转换为字符串格式(序列化)以及将字符串格式转换回数据结构(反序列化)的方法。

  6. 用户界面数据绑定

    • 在Qt的模型/视图框架中,JSON数据可以被用来动态地更新用户界面。

QJsonValue, QJsonObject, QJsonArray, 和 QJsonDocument 

QJsonValue, QJsonObject, QJsonArray, 和 QJsonDocument 是 Qt 框架中用于处理JSON数据的类。以下是这些类的简要介绍:

  1. QJsonValue

    • 表示JSON中的一个值,可以是null、布尔值、数字、字符串、对象或数组。

    • 它是一个变体类型(variant type),可以存储不同类型的数据。

  2. QJsonObject

    • 表示JSON对象,即键值对的集合。

    • 你可以使用它来添加、查询和删除键值对。

    • QJsonObject 类似于标准C++中的 std::mapstd::unordered_map

  3. QJsonArray

    • 表示JSON数组,即有序的值集合。

    • 你可以使用它来添加、查询和删除数组中的元素。

    • QJsonArray 类似于标准C++中的 std::vectorstd::list

  4. QJsonDocument

    • 表示一个JSON文档,它可以包含一个JSON对象或一个JSON数组。

    • QJsonDocument 类用于解析JSON字符串,生成 QJsonObjectQJsonArray,并且可以将它们序列化回JSON字符串。

序列化与反序列化示例用法:
序列化(将Qt数据结构转换为JSON字符串)
  1. 创建QJsonObjectQJsonArray: 使用QJsonObject创建一个JSON对象,使用QJsonArray创建一个JSON数组。

  2. 填充数据: 向QJsonObjectQJsonArray中添加数据。

  3. 创建QJsonDocument: 使用创建好的QJsonObjectQJsonArray初始化一个QJsonDocument对象。

  4. 序列化: 调用QJsonDocumenttoJson()方法将数据结构转换为JSON格式的QByteArrayQString

反序列化(将JSON字符串转换为Qt数据结构)
  1. 创建QJsonDocument: 使用QJsonDocument::fromJson()方法从JSON字符串创建QJsonDocument对象。

  2. 检查文档类型: 使用QJsonDocumentisObject()isArray()方法检查文档类型。

  3. 提取数据: 如果文档是对象类型,使用object()方法获取QJsonObject;如果是数组类型,使用array()方法获取QJsonArray

  4. 访问数据: 根据需要访问和处理QJsonObjectQJsonArray中的数据。

// 创建一个QJsonObject
QJsonObject object;
object["name"] = "John Doe";
object["age"] = 30;
object["isEmployed"] = true;
​
// 创建一个QJsonArray
QJsonArray array;
array.append("Apple");
array.append("Banana");
array.append("Cherry");
​
// 将QJsonObject添加到QJsonArray
array.append(object);
​
// 创建QJsonDocument并设置其根为QJsonObject
QJsonDocument doc(array);
​
// 将QJsonDocument序列化为JSON字符串
QString jsonString = doc.toJson(QJsonDocument::Indented);
​
// 解析JSON字符串到QJsonDocument
QJsonDocument doc = QJsonDocument::fromJson(jsonString.toUtf8());
​
// 反序列化:从JSON字符串转换为Qt数据结构
if (doc.isObject()) {
    QJsonObject obj = doc.object();
    QString name = obj["name"].toString();
    // 处理其他数据...
} else if (doc.isArray()) {
    QJsonArray arr = doc.array();
    // 处理数组数据...
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值