一.概念介绍
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输和存储。它具有以下特点:
-
易读性:JSON 使用人类可读的文本格式表示数据,采用键值对的方式组织数据,易于阅读和编辑。
-
轻量级:JSON 数据格式较为简洁,不包含冗余信息,适合网络传输和存储。
-
自描述性:JSON 数据的结构清晰明了,键值对以及数组的嵌套结构能够清晰地表示复杂数据。
-
易于解析:JSON 数据可以方便地被解析成多种编程语言中的数据结构,如对象、数组等。
-
跨平台兼容:由于 JSON 是一种文本格式,不依赖特定的编程语言,能够被多种编程语言解析和生成。
JSON 数据通常由对象(Object)和数组(Array)组成:
- 对象(Object):由一组键值对构成,使用大括号 {} 表示。示例:{“name”: “Alice”, “age”: 30}
- 数组(Array):由一组值构成,使用中括号 [] 表示。数组中的元素可以是对象、数组或基本数据类型。示例:[“apple”, “banana”, “cherry”]
总之,JSON 是一种简单、轻量级、易读的数据交换格式,被广泛应用于 Web 开发、API 设计和数据交换等领域。通过了解 JSON 的基本概念和语法规则,可以更好地进行数据交互与处理。
二.重要的部分介绍
1. QJsonDocument:
- QJsonDocument 类用于表示整个 JSON 文档,可以包含一个 JSON 对象或一个 JSON 数组。
- 可以使用该类来创建、读取、写入和操作 JSON 数据。
- 成员函数:toJson() 将 JSON 文档转换为字符串,fromJson() 从字符串中解析 JSON 数据。
示例代码如下:
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建 JSON 对象
QJsonObject personObject;
personObject["name"] = "Alice";
personObject["age"] = 30;
personObject["isStudent"] = true;
QJsonArray fruitsArray = {"apple", "banana", "cherry"};
personObject["favoriteFruits"] = fruitsArray;
QJsonObject addressObject;
addressObject["city"] = "New York";
addressObject["zipcode"] = "10001";
personObject["address"] = addressObject;
// 将 JSON 对象转换为 JSON 文档
QJsonDocument jsonDocument(personObject);
// 将 JSON 文档转换为 JSON 字符串
QString jsonString = jsonDocument.toJson();
qDebug() << "Generated JSON string:" << jsonString;
// 解析 JSON 字符串为 JSON 文档
QJsonDocument parsedDocument = QJsonDocument::fromJson(jsonString.toUtf8());
if (!parsedDocument.isNull() && parsedDocument.isObject()) {
QJsonObject parsedObject = parsedDocument.object();
QString name = parsedObject["name"].toString();
int age = parsedObject["age"].toInt();
bool isStudent = parsedObject["isStudent"].toBool();
qDebug() << "Parsed name:" << name;
qDebug() << "Parsed age:" << age;
qDebug() << "Parsed isStudent:" << isStudent;
} else {
qDebug() << "Failed to parse JSON";
}
return a.exec();
}
2.QJsonObject(这和map很相似)
- QJsonObject 类用于表示 JSON 对象,它是键值对的集合,其中键为字符串,值可以是字符串、整数、布尔值、对象或数组。
- 可以通过下标操作符 [] 或 insert() 方法来添加键值对。
- 成员函数:value() 可以获取指定键对应的值,contains() 用于检查是否包含指定键。
示例代码如下:
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个空的 JSON 对象
QJsonObject personObject;
// 添加键值对到 JSON 对象
personObject["name"] = "Alice";
personObject["age"] = 30;
personObject["isStudent"] = true;
// 创建包含一组值的 JSON 数组
QJsonArray fruitsArray = {"apple", "banana", "cherry"};
personObject["favoriteFruits"] = fruitsArray;
// 创建一个嵌套的 JSON 对象
QJsonObject addressObject;
addressObject["city"] = "New York";
addressObject["zipcode"] = "10001";
personObject["address"] = addressObject;
// 访问和输出 JSON 对象中的值
qDebug() << "Name:" << personObject["name"].toString();
qDebug() << "Age:" << personObject["age"].toInt();
qDebug() << "Is Student:" << personObject["isStudent"].toBool();
// 访问嵌套的 JSON 对象中的值
QJsonObject nestedAddress = personObject["address"].toObject();
qDebug() << "City:" << nestedAddress["city"].toString();
qDebug() << "Zipcode:" << nestedAddress["zipcode"].toString();
// 修改 JSON 对象中的值
personObject["age"] = 35;
// 移除 JSON 对象中的某个键值对
personObject.remove("isStudent");
// 转换 JSON 对象为字符串
QJsonDocument jsonDocument(personObject);
QString jsonString = jsonDocument.toJson();
qDebug() << "Updated JSON object:" << jsonString;
return a.exec();
}
3. QJsonArray
- QJsonArray 类用于表示 JSON 数组,它是值的有序集合,值可以是字符串、整数、布尔值、对象或数组。
- 可以使用 append()、insert()、at() 等方法操作数组元素。
- 成员函数:size() 返回数组中元素的数量,at() 根据索引获取指定位置的元素。
#include <QCoreApplication>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 创建一个空的 JSON 数组
QJsonArray fruitsArray;
// 向 JSON 数组添加元素
fruitsArray.append("apple");
fruitsArray.append("banana");
fruitsArray.append("cherry");
// 创建一个包含多个不同类型元素的 JSON 数组
QJsonArray mixedArray;
mixedArray.append(10);
mixedArray.append(true);
mixedArray.append("hello");
// 输出数组元素
qDebug() << "Fruits in the array:";
for(const QJsonValue &value : fruitsArray) {
qDebug() << value.toString();
}
qDebug() << "Elements in mixed array:";
for(const QJsonValue &value : mixedArray) {
if(value.isBool()) {
qDebug() << value.toBool();
} else if(value.isDouble()) {
qDebug() << value.toDouble();
} else if(value.isString()) {
qDebug() << value.toString();
}
}
// 访问数组元素
qDebug() << "First fruit:" << fruitsArray.at(0).toString();
qDebug() << "Last fruit:" << fruitsArray.last().toString();
// 修改数组元素
fruitsArray.replace(1, "pear");
// 移除数组元素
fruitsArray.removeAt(2);
// 转换 JSON 数组为字符串
QJsonDocument jsonDocument(fruitsArray);
QString jsonString = jsonDocument.toJson();
qDebug() << "Updated JSON array:" << jsonString;
return a.exec();
}
4.JSON 数据的解析
- 使用 QJsonDocument::fromJson() 将 JSON 字符串解析为 QJsonDocument 对象。
- 判断解析后的对象类型(是对象还是数组),然后获取各个属性的值。
5. QString与QByteArray
在 Qt 中,QString 和 QByteArray 是两种用于处理字符串数据的类,它们在存储和操作字符串上有一些不同之处。下面是关于 QString 和 QByteArray 的详细介绍:
QString
-
QString 是 Qt 中用于表示 Unicode 字符串的类,它支持多种字符编码,包括 UTF-8、UTF-16 等。
-
特点:
- 支持 Unicode 字符,可以表示任意国家地区的字符。
- 自动转码:QString 会自动处理不同字符编码之间的转换。例如,可以使用 toUtf8() 方法将 QString 转换为 QByteArray。
- 提供了丰富的字符串操作方法,如拼接、查找、替换、大小写转换等。
使用场景:
- 存储用户界面文本、表示用户输入。
- 作为跨平台的字符串处理工具,便于处理各种字符编码和国际化需求。
QByteArray
- QByteArray 是 Qt 中用于表示字节数据的类,通常用于存储二进制数据或者不包含特定字符编码的文本数据。
特点:
- 与 QString 不同,QByteArray 主要是字节级别的操作,适用于处理二进制数据。
- 通常用于读写文件、网络数据、加密解密等场景。
- 字节数据一般不涉及字符编码的转换,更适合存储不特定编码的数据。
使用场景:
- 存储二进制数据,如图片、音频、视频等。
- 读写文件内容,处理网络数据传输。
- 加密解密操作等需要处理字节数据的场景。
总结
-
如果需要处理文本数据,并且涉及到字符串操作、多语言支持或者用户界面相关的文本处理,通常使用 QString。
-
如果处理的数据为字节数据、二进制数据或者不需要特定字符编码的数据,可以使用 QByteArray。
三.JSON读写文件实战
- Json格式如下:
{
"Name":"Ace",
"Sex":"man",
"Age":20,
"Family":{
"Father":"Gol·D·Roger",
"Mother":"Portgas·D·Rouge",
"Brother":["Sabo", "Monkey D. Luffy"]
},
"IsAlive":false,
"Comment":"yyds"
}
- 写文件
void MainWindow::writeJson()
{
//创建一个Json对象
QJsonObject obj;//对象可以说是和map一模一样
//"Ace"发生了隐式类型转换
obj.insert("name","Ace");
obj.insert("sex","man");
obj.insert("age",20);
//创建子对象
QJsonObject subObj;
subObj.insert("father","Gol·D·Roger");
subObj.insert("Mother","Portgas·D·Rouge");
//构建一个Json数组的对象
QJsonArray array;
array.append("Sabo");
array.append("Monkey D. Luffy");
subObj.insert("Brother",array);
obj.insert("Family",subObj);
obj.insert("IsAlive",false);
obj.insert("Comment","yyds");
//将json的对象转换成文档类型
QJsonDocument doc(obj);
//将其转换成字符串类型,QByteArray在qt中就是表示字符串
QByteArray json = doc.toJson();
//写入磁盘文件中
QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");
file.open(QFile::WriteOnly);
file.write(json);
file.close();
}
- 读文件
void MainWindow::readJson()
{
//读文件
QFile file("G:\\qtcodetest\\QJsonTest\\mytest.json");
file.open(QFile::ReadOnly);
QByteArray all = file.readAll();
file.close();
//读出的文件进行转换
QJsonDocument doc = QJsonDocument::fromJson(all);
if(doc.isObject())
{
QJsonObject obj = doc.object();
QStringList keys = obj.keys();
for(int i=0; i<keys.size(); ++i)
{
QString key = keys.at(i);
QJsonValue value = obj.value(key);
if(value.isBool())
{
qDebug() << key << ":" << value.toBool();
}
if(value.isString())
{
qDebug() << key << ":" << value.toString();
}
if(value.isDouble())
{
qDebug() << key << ":" << value.toInt();
}
if(value.isObject())
{
qDebug()<< key << ":";
// 直接处理内部键值对, 不再进行类型判断的演示
QJsonObject subObj = value.toObject();
QStringList ls = subObj.keys();
for(int i=0; i<ls.size(); ++i)
{
QJsonValue subVal = subObj.value(ls.at(i));
if(subVal.isString())
{
qDebug() << " " << ls.at(i) << ":" << subVal.toString();
}
if(subVal.isArray())
{
QJsonArray array = subVal.toArray();
qDebug() << " " << ls.at(i) << ":";
for(int j=0; j<array.size(); ++j)
{
// 因为知道数组内部全部为字符串, 不再对元素类型进行判断
qDebug() << " " << array[j].toString();
}
}
}
}
}
}
}