一.前言:
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 键值对到 rootObjrootObj.insert("name","小王");// 插入 age 键值对到 rootObjrootObj.insert("age",30);// 创建地址 JSON 对象,里面包含两个键值对QJsonObject addressObj;addressObj.insert("city","北京");addressObj.insert("street","人民路32号");// 插入地址 JSON 对象到 rootObjrootObj.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 数组到 rootObjrootObj.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) {// 获取每一个 keyQString key = keys[i];// 通过 key 获取对应的 valueQJsonValue value = obj.value(key);if(value.isBool()){// 值是一个 boolqDebug()<<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;}}}
}