一.前言:
JSON是一种轻量级数据交换格式,常用于客户端和服务端的数据交互,不依赖于编程语言,在很多编程语言中都可以使用JSON,比如C,C++,Java,Android,Qt。除了JSON,还有一种数据传输格式XML,相较于XML,JSON更加便于阅读和书写。
JSON 有两种数据格式:JSON对象和JSON数组。被中括号包裹的是JSON数组,被大括号包裹的是JSON对象。
二.JSON数组:
JSON数组的格式:[元素1,元素2,元素3,…]
示例1:元素可以是不同数据类型
[1,2,3.14,"hello world",true,null]
示例2:元素可以是JSON对象或JSON数组
[
{
"id":123,
"name":"tom"
},
[1,2,3.14,"hello world",true,null]
]
三.JSON对象:
JSON对象的格式:一个或多个键值对组成
示例1:
{
"id":123,
"name":"tom"
}
示例2:嵌套JSON对象和JSON数组,JSON对象和JSON数组也要使用键值对格式
{
"name": "John Doe",
"age": 30,
"address": {
"city": "New York",
"street": "123 Main St"
},
"phoneNumbers": [
{
"type": "home",
"number": "555-1234"
},
{
"type": "work",
"number": "555-5678"
}
],
"hobbies": ["reading", "painting", "playing guitar"],
"isStudent": true
}
小结:JSON数组里可以包含JSON对象或JSON数组,JSON对象里也可以嵌套JSON对象或JSON数组。
四.Qt中JSON的使用:1.生成JSON数据、2.解析JSON数据
在QT5.0版本以后支持对JSON的使用,QT5.0之前需要自己集成第三方库。
1.生成JSON数据
要生成的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>
void MainWindow::writeJSON()
{
// 创建最外层的 JSON 对象,里面包含要构建的所有 JSON 数据
QJsonObject rootObj;
// 插入 name 键值对到 rootObj
rootObj.insert("name","小王");
// 插入 age 键值对到 rootObj
rootObj.insert("age",30);
// 创建地址 JSON 对象,里面包含两个键值对
QJsonObject addressObj;
addressObj.insert("city","北京");
addressObj.insert("street","人民路32号");
// 插入地址 JSON 对象到 rootObj
rootObj.insert("address",addressObj);
// 创建电话 JSON 数组,里面包含两个电话 JSON 对象
QJsonArray phoneArray;
// 创建两个电话 JSON 对象
QJsonObject phoneHomeObj;
phoneHomeObj.insert("type","家");
phoneHomeObj.insert("number","999-123456");
QJsonObject phoneWorkObj;
phoneWorkObj.insert("type","公司");
phoneWorkObj.insert("number","999-654321");
// 在电话 JSON 数组中添加两个电话 JSON 对象
phoneArray.append(phoneHomeObj);
phoneArray.append(phoneWorkObj);
// 插入电话 JSON 数组到 rootObj
rootObj.insert("phoneNumbers",phoneArray);
// 将 rootObj JSON对象转换为 JSON 数据格式
QJsonDocument doc(rootObj);
QByteArray json = doc.toJson();
// 打印
qDebug()<<QString::fromUtf8(json);
}
2.解析JSON数据
要解析的JSON数据如下,先将它放在test.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>
void MainWindow::analyseJSON()
{
// 读取文本中的 JSON 数据
QFile file("C:\\Users\\A\\Desktop\\temp\\test.json");
file.open(QFile::ReadOnly);
QByteArray json = file.readAll();
file.close();
// 将 JSON 数据转换为 QJsonDocument 对象
QJsonDocument doc = QJsonDocument::fromJson(json);
if(!doc.isObject())
{// 不是 JSON 对象:JSON 字符串格式错误或无效
qDebug()<<"不是 JSON 对象:JSON 字符串格式错误或无效";
return;
}
// 将 QJsonDocument 对象中的 JSON 数据转换为 JSON 对象
QJsonObject obj = doc.object();
// 获取 JSON 数据中的所有键
QStringList keys = obj.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;
}
}
}
}