You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt C++读取JSON文件并在按钮点击时显示到标签的问题求助

Qt读取JSON文件并显示到标签控件的问题解决

问题背景

我有如下格式的JSON文件:

{
  "userList": [
      {
        "id": "1",
        "Name": "Tom",
        "lastName": "Cruise",
        "email": "tom@gmail.com",
        "gender": "male",
        "dateOfBirth": "9.9.1990",
        "street": "tom Cruse street",
        "city": "New york",
        "postalCode": "11445",
        "phone": "123123123",
        "imagePath": "0"
      }
   ]
}

我希望在pushButton的点击事件中读取该文件的所有数据并显示到Qt的标签控件中。刚接触Qt,第一次尝试的代码无法正常工作:

QFile file("C:/Users/CZV/Documents/userList.json");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
   qDebug() << "Failed to open file";
}
QJsonDocument doc=QJsonDocument::fromJson(file.readAll());

QJsonObject obj = doc.object(); // get root
QJsonValue idVal =obj.value("id"); // get value for key "name"
QJsonValue nameVal =obj.value("Name");
QJsonValue lastNameVal =obj.value("lastName");
QJsonValue emailVal =obj.value("email");
QJsonValue genderVal =obj.value("gender");
QJsonValue dobVal =obj.value("dateOfBirth");
QJsonValue streetVal =obj.value("street");
QJsonValue cityVal =obj.value("city");
QJsonValue postVal =obj.value("postalCode");
QJsonValue phoneVal =obj.value("phone");
QJsonValue imgVal =obj.value("imagePath");
ui->clabelName->setText(nameVal.toString());
ui->clabelLastName->setText(nameVal.toString());
ui->clabelEmail->setText(emailVal.toString());
ui->clabelGender->setText(genderVal.toString());
ui->clabelDoB->setText(dobVal.toString());
ui->clabelStreet->setText(streetVal.toString());
ui->clabelCity->setText(cityVal.toString());
ui->clabelPost->setText(postVal.toString());
ui->clabelPhone->setText(phoneVal.toString());

问题分析

  • JSON结构解析错误:根对象的键是userList,它对应一个数组,用户的字段(id、Name等)都在数组的元素对象里,而非直接在根对象中。你的代码直接从根对象取这些键,必然获取不到有效值。
  • 标签赋值错误:ui->clabelLastName->setText(nameVal.toString());这里错误地使用了nameVal,应该用lastNameVal。

修正后的代码

void YourWidgetClass::on_pushButton_clicked()
{
    QFile file("C:/Users/CZV/Documents/userList.json");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Failed to open file";
        return; // 文件打开失败直接返回,避免后续错误
    }

    QByteArray jsonData = file.readAll();
    file.close(); // 读取完成后关闭文件

    QJsonParseError parseError;
    QJsonDocument doc = QJsonDocument::fromJson(jsonData, &parseError);
    if (parseError.error != QJsonParseError::NoError) {
        qDebug() << "JSON parse error:" << parseError.errorString();
        return;
    }

    if (!doc.isObject()) {
        qDebug() << "JSON root is not an object";
        return;
    }

    QJsonObject rootObj = doc.object();
    if (!rootObj.contains("userList") || !rootObj["userList"].isArray()) {
        qDebug() << "userList not found or not an array";
        return;
    }

    QJsonArray userArray = rootObj["userList"].toArray();
    if (userArray.isEmpty()) {
        qDebug() << "userList is empty";
        return;
    }

    // 取数组第一个用户对象
    QJsonObject userObj = userArray.first().toObject();

    // 提取各个字段
    QString id = userObj.value("id").toString();
    QString name = userObj.value("Name").toString();
    QString lastName = userObj.value("lastName").toString();
    QString email = userObj.value("email").toString();
    QString gender = userObj.value("gender").toString();
    QString dob = userObj.value("dateOfBirth").toString();
    QString street = userObj.value("street").toString();
    QString city = userObj.value("city").toString();
    QString postalCode = userObj.value("postalCode").toString();
    QString phone = userObj.value("phone").toString();
    QString imgPath = userObj.value("imagePath").toString();

    // 赋值到标签
    ui->clabelName->setText(name);
    ui->clabelLastName->setText(lastName); // 修正这里的赋值错误
    ui->clabelEmail->setText(email);
    ui->clabelGender->setText(gender);
    ui->clabelDoB->setText(dob);
    ui->clabelStreet->setText(street);
    ui->clabelCity->setText(city);
    ui->clabelPost->setText(postalCode);
    ui->clabelPhone->setText(phone);
}

额外说明

  • 加入了JSON解析错误检查和各种边界判断,能帮你快速定位问题(比如文件损坏、结构异常等)。
  • 读取文件后记得关闭,养成良好的资源管理习惯。
  • 如果后续userList里有多个用户,可以通过遍历数组来处理每一个用户的数据。

内容的提问来源于stack exchange,提问作者Marko Mitrović

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 23:27:44