你提供的字符串是一个无效的JSON格式,因为它由两个JSON对象直接连接在一起,而没有使用逗号或其他符号分隔。
为了处理这个问题,我们可以将字符串拆分为两个有效的JSON对象。假设这两个JSON对象相同,你可以选择解析其中一个。在这里,我会给出如何解析第一个JSON对象的示例代码。
以下是一个Qt示例代码,演示了如何处理并解析第一个有效的JSON对象:
#include <QCoreApplication>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QString>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 你的 JSON 字符串
std::string str = R"({"device_id":"673db461ef99673c8acec2c4_home_3861","shadow":[{"service_id":"attribute","desired":{"properties":null,"event_time":null},"reported":{"properties":{"buzzer":"OFF","fan":"OFF","led":"OFF","humidity":38,"temperature":22,"light":0,"proximity":0,"co_value":871,"infrared":0},"event_time":"20241126T050051Z"},"version":3058}]})";
// 将 std::string 转换为 QString
QString jsonString = QString::fromStdString(str);
// 解析 JSON 字符串
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());
if (jsonDoc.isNull()) {
qDebug() << "Failed to create JSON doc.";
return -1;
}
// 确保文档是对象类型
if (!jsonDoc.isObject()) {
qDebug() << "JSON is not an object.";
return -1;
}
QJsonObject jsonObj = jsonDoc.object();
// 获取 device_id
QString deviceId = jsonObj["device_id"].toString();
qDebug() << "Device ID:" << deviceId;
// 获取 shadow 数组
QJsonArray shadowArray = jsonObj["shadow"].toArray();
for (const auto& item : shadowArray) {
QJsonObject shadowObj = item.toObject();
// 获取 reported 对象
QJsonObject reportedObj = shadowObj["reported"].toObject();
// 获取 properties 对象中的值
QJsonObject propertiesObj = reportedObj["properties"].toObject();
QString buzzerState = propertiesObj["buzzer"].toString();
QString fanState = propertiesObj["fan"].toString();
QString ledState = propertiesObj["led"].toString();
int humidityValue = propertiesObj["humidity"].toInt();
int temperatureValue = propertiesObj["temperature"].toInt();
qDebug() << "Buzzer:" << buzzerState;
qDebug() << "Fan:" << fanState;
qDebug() << "LED:" << ledState;
qDebug() << "Humidity:" << humidityValue;
qDebug() << "Temperature:" << temperatureValue;
// 其他属性可以按照需求继续获取...
}
return a.exec();
}
在这个示例中,我们只处理第一个有效的JSON字符串。如果需要解析第二个相同的对象,你可以将其单独存储并再次进行类似的处理。
注意事项:
- 有效性:确保传入的字符串格式正确,应该只有一个完整且有效的JSON。
- 错误处理:在实际应用中,应当考虑更多错误处理,例如检查数据是否存在等。
内容由零声教学AI助手提供,问题来源于学员提问