Qt基础知识(4):JSON文件读写

        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);

猜你喜欢

转载自blog.csdn.net/weixin_55238862/article/details/135419533