????????JSON是英文JavaScript Object Notation 的缩写,它是一种轻量级的数据交换格式,具有方便阅读和编写的优点,同时也易于机器解析和生成。JSON数据格式应用广泛,能够用于多种语言之间的数据交换。当前开源的C++JSON解析库有大概几十种,比较著名的有jsoncpp、nlohmann/json、rapidjson、jsonxx等。除此之外Qt5.0以上的版本也提供了JSON数据的读写支持。
(1)写入json
//生成json
void MainWindow::on_pushButton_clicked()
{
? ? ui->textEdit->clear();
? ? // json数组添加数据方式1
? ? QJsonArray array = {1, 2, 3, 4, "123"};
? ? // json数组添加数据方式2
? ? array.append(QJsonValue(true)); ? ? ? ?// 添加bool 数据
? ? array.append(QJsonValue(1.23)); ? ? ? ?// 添加double 数据
? ? array.append(QJsonValue(123)); ? ? ? ? // 添加int数据
? ? array.append(QJsonValue("abc")); ? ? ? // 添加Qstring数据
? ? QJsonArray array1 = {111, 222, 333};
? ? array.append(array1); ? ? ?// 添加数组数据
? ? QJsonObject obj1 ? // json对象添加【键值对】方式1
? ? {
? ? ? ? {"键值1", 1},
? ? ? ? {"键值2", 2}
? ? };
? ? array.append(QJsonValue(obj1)); ? ? ? ?// 添加JSON对象数据
? ? QJsonObject obj2;
? ? // json对象添加【键值对】方式2
? ? obj2.insert("键值0", array);
? ? m_doc.setObject(obj2);
? ? QString strJaon(m_doc.toJson(QJsonDocument::Indented)); ? // json转Qstring,indented表示转为可读格式(有换行、缩进)
? ? ui->textEdit->append("<------------- 生成json ------------->");
? ? ui->textEdit->append(strJaon);
}
//保存json
void MainWindow::on_pushButton_2_clicked()
{
? ? QString filename = QFileDialog::getSaveFileName(this,"操作提示","./","Json文件(*.json)");
? ? if(!filename.isEmpty()){
? ? ? ? QFile file(filename);
? ? ? ? file.open(QIODevice::ReadWrite | QIODevice::Truncate);
? ? ? ? file.write(m_doc.toJson(QJsonDocument::Indented));
? ? ? ? file.close();
? ? }
}
(2)读取json
void MainWindow::JsonParse(QJsonValue value)
{
? ? int i;
? ? switch (value.type()) {
? ? case QJsonValue::Null:
? ? ? ? break;
? ? case QJsonValue::Bool:
? ? ? ? ui->textEdit->append(QString("bool数据类型:%1").arg(value.toBool()));
? ? ? ? break;
? ? case QJsonValue::Double:
? ? ? ? ui->textEdit->append(QString("bool数据类型:%1").arg(value.toDouble()));
? ? ? ? break;
? ? case QJsonValue::Array:{
? ? ? ? ui->textEdit->append("数组:------------- start");
? ? ? ? QJsonArray arr = value.toArray();
? ? ? ? for(i = 0;i < arr.count(); i++) ? // 遍历数组
? ? ? ? {
? ? ? ? ? ? QJsonValue v = arr.at(i);
? ? ? ? ? ? JsonParse(v); ? // 使用递归的方式解析数组内容
? ? ? ? }
? ? ? ? ui->textEdit->append("数组:------------- end");
? ? ? ? break;
? ? }
? ? case QJsonValue::String:
? ? ? ? ui->textEdit->append(QString("bool数据类型:%1").arg(value.toString()));
? ? ? ? break;
? ? case QJsonValue::Object:
? ? {
? ? ? ? ui->textEdit->append("对象:------------- start");
? ? ? ? QJsonObject obj = value.toObject();
? ? ? ? QStringList keys = obj.keys(); ? ? ? ?// 获取所有的键值
? ? ? ? for(i = 0;i < keys.length();i++)
? ? ? ? {
? ? ? ? ? ? QString key = keys[i];
? ? ? ? ? ? ui->textEdit->append(QString("键值:%1").arg(key));
? ? ? ? ? ? JsonParse(obj[key]); ? ? ? ? ? // 通过键值获取数据,并调用解析函数递归解析
? ? ? ? }
? ? ? ? ui->textEdit->append("对象:------------- end");
? ? ? ? break;
? ? }
? ? case QJsonValue::Undefined:
? ? ? ? break;
? ? }
}
//解析json
void MainWindow::on_pushButton_3_clicked()
{
? ? QString path = QFileDialog::getOpenFileName(this, "打开json文件", "./", "Json文件 (*.json)");
? ? if(path.isEmpty()) return;
? ? // 将json数据保存到文件
? ? QFile file(path);
? ? if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
? ? {
? ? ? ? qWarning() << "打开文件失败!";
? ? ? ? return;
? ? }
? ? // 读取json数据
? ? QByteArray arr = file.readAll();
? ? file.close();
? ? if(arr.isEmpty()) return;
? ? QJsonParseError err;
? ? QJsonDocument doc = QJsonDocument::fromJson(arr, &err);
? ? if(doc.isEmpty()) ? // 如果加载json数据失败则打印失败信息
? ? {
? ? ? ? qWarning() << err.errorString();
? ? }
? ? ui->textEdit->append("<------------- 解析json ------------->");
? ? if(doc.isArray()) ? ? ? ?// 如果json数据为数组类型
? ? {
? ? ? ? JsonParse(QJsonValue(doc.array()));
? ? }
? ? else if(doc.isObject()) ?// 如果Json数据为对象类型
? ? {
? ? ? ? JsonParse(QJsonValue(doc.object()));
? ? }
}
下载地址:Download cJSON
示例:?
QFile file(QString("%1/config.json").arg(QApplication::applicationDirPath()));
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
qDebug()<<"配置文件config.json打开失败";
return;
}
QString str=file.readAll();
file.close();
cJSON *json = cJSON_Parse(str.toLocal8Bit().data());
if (json) {
cJSON *stringData=cJSON_GetObjectItem(json,"String");
if(stringData!=0 && cJSON_IsString(stringData)){
QString str=stringData->valuestring;
}
cJSON *intData=cJSON_GetObjectItem(json,"Int");
if(intData!=0 && cJSON_IsNumber(intData)){
int data=intData->valueint;
}
}
cJSON_Delete(json);