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ć
相关产品推荐
相关产品推荐

