Qt - Json解析与构建
1. JSON 有什么作用?
-
🐧①
JSON
即为JS
对象表示法(因为它和JS
中对象的写法很相似),与JavaScript
是没啥关系的; -
🐧②
JSON
本质是一种特殊格式的字符串; -
🐧③
JSON
是一种轻量级的数据交互格式,客户端和服务端数据交互,基本都是JSON
格式;
2. JSON 的特点
-
① 便于阅读和书写除
JSON
外,还有一种数据交互的格式XML
,但是JSON
更便于书写和阅读 -
② 独立于编程语言,几乎所有的编程语言和开发环境中,都有生成和解析
JSON
字符串的库
-
③ 网络传输的标准数据格式
3. JSON 的两种数据格式
JSON
有两种数据格式:
⚽JSON
对象,被{ }
包裹
⚽JSON
数组,被[]
包裹
3.1 JSON 数组
- 🍎
JSON
数组中可以放置任意的类型,可以在数组中放置JSON
对象,JSON
数组
3.2 JSON 对象
- 🍎
JSON
对象是键值对的形式,键的类型是字符串,值的类型可以为数组,对象,整形,浮点型;
4. Qt 中如何使用 JSON 呢?
在Qt库中,为JSON的相关操作提供了完整的类支持,包括QJsonValue,QJsonObject,QJsonArray,QJsonDocument和QJsonParseError。其中,QJsonValue类表示json格式中的一个值;QJsonObject表示一个json对象;QJsonArray顾名思义表示一个json数组;QJsonDocument主要用来读写json文档;而QJsonParseError是用来表示json解析过程中出现的错误的方便类。
4.1 QJsonObject
4.2 QJsonArray
4.3 QJsonValue
4.4 QJsonDocument
5. 构建 JSON 字符串
#include <QCoreApplication>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>
#include <QFile>
void writeJson()
{
QJsonObject rootQJsonObject;
// 插入 name 字段
rootQJsonObject.insert("name", "China");
// 插入 info 字段
QJsonObject infoQJsonObject;
infoQJsonObject.insert("capital", "beijing");
infoQJsonObject.insert("asian", true);
infoQJsonObject.insert("founded", "1949");
rootQJsonObject.insert("info", infoQJsonObject);
// 插入 provinces 字段
QJsonArray provincesArray;
QJsonObject sdProvincesQJsonObject;
sdProvincesQJsonObject.insert("name", "shangdong");
sdProvincesQJsonObject.insert("capital", "jinan");
QJsonObject zjProvincesQJsonObject;
zjProvincesQJsonObject.insert("name", "zhejiang");
zjProvincesQJsonObject.insert("capital", "hangzhou");
provincesArray.append(sdProvincesQJsonObject);
provincesArray.append(zjProvincesQJsonObject);
rootQJsonObject.insert("provinces", provincesArray);
// 把 json 对象转换成为 字符串
QJsonDocument doc(rootQJsonObject);
QByteArray json = doc.toJson();
// 打印输出
qDebug() << QString(json).toUtf8().data();
// 将 json 字符串写入到文件
QFile file("d:\\china.json");
file.open(QFile::WriteOnly);
file.write(json);
file.close();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
writeJson();
return a.exec();
}
6. 解析 JSON 字符串
#include <QCoreApplication>
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>
void readJson()
{
// 1. 读取文件
QFile file("d:\\china.json");
file.open(QFile::ReadOnly);
QByteArray json = file.readAll();
file.close();
QJsonDocument doc = QJsonDocument::fromJson(json);
if (!doc.isObject()) {
qDebug() << " Not an object";
return;
}
QJsonObject obj = doc.object();
QStringList keys = obj.keys();
for (int i = 0; i < keys.size(); i ++)
{
// 获取 key - value
QString key = keys[i];
QJsonValue value = obj.value(key);
if (value.isBool()){
qDebug() << "key : " << key << " value : " << value.toBool();
} else if (value.isDouble()) {
qDebug() << "key : " << key << " value : " << value.toDouble();
} else if (value.isString()) {
qDebug() << "key : " << key << " value : " << value.toString();
} else if (value.isObject()) {
qDebug() << key << ":";
QJsonObject infoObject = value.toObject();
QString capital = infoObject["capital"].toString();
bool asian = infoObject["asian"].toBool();
QString founded = infoObject["founded"].toString();
qDebug() << "capital : " << capital;
qDebug() << "asian : " << asian;
qDebug() << "founded" << founded;
} else if (value.isArray()){
QJsonArray provincesArray = value.toArray();
for (int i = 0; i < provincesArray.size(); i ++)
{
QJsonObject sdJsonObject = provincesArray[i].toObject();
qDebug() <<"name: " << sdJsonObject["name"].toString();
qDebug() <<"capital: " << sdJsonObject["capital"].toString();
}
}
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
readJson();
return a.exec();
}
json数据格式示例:
{
"name": "Alice",
"age": 30,
"isStudent": false,
"courses": [
{
"courseName": "Mathematics",
"credits": 3,
"instructor": {
"name": "Dr. Smith",
"email": "smith@example.com"
}
},
{
"courseName": "Physics",
"credits": 4,
"instructor": {
"name": "Dr. Johnson",
"email": "johnson@example.com"
}
}
]
}
怎么将上面的JSON语句用Qt构建出来呢,可以利用JSON解析工具来理清结构:https://jsontool.cn/
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Hou_lang_LJ/article/details/140624636