JSON是英文JavaScript Object Notation 的缩写,它是一种轻量级的数据交换格式,具有方便阅读和编写的优点,同时也易于机器解析和生成。JSON数据格式应用广泛,能够用于多种语言之间的数据交换。当前开源的C++JSON解析库有大概几十种,比较著名的有jsoncpp、nlohmann/json、rapidjson、jsonxx等。除此之外Qt5.0以上的版本也提供了JSON数据的读写支持。
1.使用Qt类进行解析
(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()));
}
}
2.使用cJSON库解析
下载地址: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);