QT笔记---JSON
- JSON
- 1、JSON基本概念
- 1.1、判断.json文件工具
- 2、生成.json数据
- 3、解析.json数据
JSON
在现代软件开发中,数据的交换和存储格式至关重要。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁易读、易于解析和生成的特点,被广泛应用于各种应用程序中。在 QT 框架下,处理 JSON 数据同样便捷高效。
本文参考链接:https://blog.csdn.net/qq_42432673/article/details/132115700
1、JSON基本概念
JSON 数据结构主要由两种类型构成:对象(object)和数组(array)。对象是由键值对组成的无序集合,键必须是字符串,值可以是字符串、数字、布尔值、null、对象或数组。数组则是值的有序集合,这些值同样可以是上述各种类型。例如:
{
"address": {
"city": "WuHan",
"street": "luck"
},
"age": "31",
"hobbies": [
"reading",
"painting",
"playing guitar"
],
"isStudent": "true",
"name": "John Doe",
"phoneNumbers": [
{
"number": "888-1234",
"type": "home"
},
{
"number": "888-5678",
"type": "work"
}
]
}
1.1、判断.json文件工具
JSON转C#实体类网站,可判断JSON文件是否正确:https://www.bejson.com/convert/json2csharp/
2、生成.json数据
根据以上json内存,创建一个文件夹,将其写入.json文件夹,保存在项目下,运行代码如下所示:
//包含的头文件
#include <QMainWindow>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QString>
#include <QFile>
//创建一个json文件,写入参数,并保存在对应的路径下
void MainWindow::WriteToFile()
{
QString m_path = QString::fromStdString(QCoreApplication::applicationDirPath().toStdString()+"//cfg.json");
createJsonFile(m_path);
}
void MainWindow::createJsonFile(const QString &filePath)
{
//创建一个JSON对象
QJsonObject jsonObj;
//插入name 键值对到 jsonObj
jsonObj["name"]="John Doe";
//jsonObj.insert("name","John Doe");
//插入age 键值对到 jsonObj
jsonObj["age"]="31";
//jsonObj.insert("age","31");
//创建地址JSON对象,里面包含两个键值对
QJsonObject addressObj;
//插入city 键值到 “New York”
addressObj.insert("city","WuHan");
addressObj.insert("street","luck");
jsonObj.insert("address",addressObj);
//创建地址JSON对象,里面包含两个键值对
QJsonArray phoneArray;
//创建两个电话的JSON对象
QJsonObject phoneHomeObj;
phoneHomeObj.insert("type","home");
phoneHomeObj.insert("number","888-1234");
QJsonObject phoneWorkObj;
phoneWorkObj.insert("type","work");
phoneWorkObj.insert("number","888-5678");
//将电话JSON数组中添加两个电话JSON对象
phoneArray.append(phoneHomeObj);
phoneArray.append(phoneWorkObj);
//将电话JSON数组中添加两个电话JSON对象
jsonObj.insert("phoneNumbers",phoneArray);
//创建地址JSON对象,里面包含了三组数组
QJsonArray hobbArray;
hobbArray.append("reading");
hobbArray.append("painting");
hobbArray.append("playing guitar");
jsonObj.insert("hobbies",hobbArray);
jsonObj["isStudent"]="true";
//创建一个JSON文档
QJsonDocument jsonDoc(jsonObj);
//将JSON文档内容写入文件
QFile file(filePath);
if(!file.open(QIODevice::WriteOnly))
{
//处理错误,例如可以抛出异常或者返回错误的标志
return;
}
file.write(jsonDoc.toJson());
file.close();
}
3、解析.json数据
创建一个cfg.json文件,将其内容粘贴负责其内;
{
"name": "小王",
"age": 30,
"address": {
"city": "北京",
"street": "人民路32号"
},
"phoneNumbers": [
{
"number": "999-123456",
"type": "家"
},
{
"number": "999-654321",
"type": "公司"
}
]
}
使用QT解析以上json内容:
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QDebug>
#include <QFile>
QByteArray MainWindow::ReadJsonString(QString file_path)
{
QFile file(file_path); //根据路径打卡文件
if (false == file.exists()) //判断文件是否存在
{
return "none";
}
if (false == file.open(QIODevice::ReadOnly | QIODevice::Text)) //判断文件是否可以正常以只读模式打开
{
return "none";
}
QByteArray string_value = file.readAll(); //读出.json所以内容
file.close();
return string_value;
}
void MainWindow::AnalyJson()
{
//json文件所在路径,可根据自己随意定制
QString path= QString::fromStdString(QCoreApplication::applicationDirPath().toStdString()+"//cfg.json");
QByteArray reg_fpga = ReadJsonString(path);
// 字符串格式化为JSON文档
QJsonParseError err_rpt;
QJsonDocument reg_fpga_root = QJsonDocument::fromJson(reg_fpga, &err_rpt);
if (err_rpt.error != QJsonParseError::NoError)
{
// 不是 JSON 对象:JSON 字符串格式错误或无效
std::cout << "json 格式错误" << std::endl;
// return 0;
}
//将 QJsonDocument 对象中的 JSON 数据转换为 JSON 对象
QJsonObject reg_object = reg_fpga_root.object();
// 获取 JSON 数据中的所有键
QStringList keys = reg_object.keys();
// 遍历键值对
for (int i = 0;i<keys.size();++i)
{
// 获取每一个 key
QString key = keys[i];
// 通过 key 获取对应的 value
QJsonValue value = obj.value(key);
if(value.isBool())
{// 值是一个 bool
qDebug()<<key<<":"<<value.toBool();
}
else if(value.isString())
{// 值是一个字符串
qDebug()<<key<<":"<<value.toString();
}
else if(value.isDouble())
{// 值是一个 double 或者 int(double 和 int 都用 isDouble)
qDebug()<<key<<":"<<value.toInt();
}
else if(value.isObject())
{// 值是一个 JSON 对象
qDebug()<<key<<":";
// 这里偷个懒,不再像上面那样循环获取值了,而是直接通过已知的键去获取值
QJsonObject addressObj = value.toObject();
QString city = addressObj["city"].toString();
QString street = addressObj["street"].toString();
qDebug()<<" "<<"city:"<<city;
qDebug()<<" "<<"street:"<<street;
}
else if (value.isArray())
{// 值是一个 JSON 数组
qDebug()<<key<<":";
QJsonArray phoneArray = value.toArray();
for (int i = 0;i<phoneArray.size();++i)
{// 遍历 JSON 数组中的每一个 JSON 对象
QJsonObject phoneObj = phoneArray[i].toObject();
QString number = phoneObj["number"].toString();
QString type = phoneObj["type"].toString();
qDebug()<<" "<<"number:"<<number;
qDebug()<<" "<<"type:"<<type;
}
}
}
}