From: Caisking <3449750381@qq.com> Date: Wed, 25 Sep 2024 11:03:17 +0000 (+0800) Subject: 增加消息json解析的错误预防处理 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=9cfd870c5b25cd2e499bc77a246ba4333e1455db;p=mirrors%2FFD230.git 增加消息json解析的错误预防处理 --- diff --git a/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp index 7ed7bff6c..5b83e40c1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp @@ -171,74 +171,95 @@ namespace OHOS } // 加载Message文件 - bool MessageModel::LoadMessagesFromStorage() - { - // 加载消息过滤文件 - filtration_file_read(); - std::ifstream file(MESSAGE_JSON_FILE); - if (!file.is_open()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for reading"); - return false; - } - - std::string fileContent((std::istreambuf_iterator(file)), std::istreambuf_iterator()); - file.close(); - - cJSON *root = cJSON_Parse(fileContent.c_str()); - if (!root) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error parsing JSON file"); - return false; - } - - cJSON *messageArray = cJSON_GetObjectItem(root, "messages"); - if (!messageArray || !cJSON_IsArray(messageArray)) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid data format in JSON file"); - cJSON_Delete(root); - return false; - } - - // 清空现有数据 - // MessageVector.clear(); - - // 将JSON数据转换为MessageData并添加到消息数组中 - int dataCount = cJSON_GetArraySize(messageArray); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dataCount is %d", dataCount); - for (int i = 0; i < dataCount; i++) - { - cJSON *item = cJSON_GetArrayItem(messageArray, i); - - cJSON *isRead = cJSON_GetObjectItem(item, "isRead"); - cJSON *labelDetails = cJSON_GetObjectItem(item, "labelDetails"); - cJSON *labelTitle = cJSON_GetObjectItem(item, "labelTitle"); - cJSON *timestamp = cJSON_GetObjectItem(item, "timestamp"); - - MessageData data; - data.isRead = cJSON_IsTrue(isRead) ? true : false; - data.labelDetails = labelDetails->valuestring; - data.labelTitle = labelTitle->valuestring; - data.timestamp = timestamp->valuedouble; - - char labelTime[20]; - if (uapi_get_TIME_STR(data.timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC) - { - data.labelTime = std::string("--"); - } - else - { - data.labelTime = std::string(labelTime); - } - - MessageVector.push_back(data); - } - - cJSON_Delete(root); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Messages loaded from storage successfully"); - return true; + bool MessageModel::LoadMessagesFromStorage() + { + // 加载消息过滤文件 + filtration_file_read(); + + std::ifstream file(MESSAGE_JSON_FILE); + if (!file.is_open()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for reading"); + return false; + } + + std::string fileContent((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + + cJSON *root = cJSON_Parse(fileContent.c_str()); + if (!root) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error parsing JSON file"); + return false; // JSON 解析失败,直接返回 + } + + cJSON *messageArray = cJSON_GetObjectItem(root, "messages"); + if (!messageArray || !cJSON_IsArray(messageArray)) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid data format in JSON file"); + cJSON_Delete(root); + return false; // 无效的消息数组,直接返回 + } + + // 清空现有数据 + MessageVector.clear(); + + // 将JSON数据转换为MessageData并添加到消息数组中 + int dataCount = cJSON_GetArraySize(messageArray); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dataCount is %d", dataCount); + + for (int i = 0; i < dataCount; i++) + { + cJSON *item = cJSON_GetArrayItem(messageArray, i); + if (!item) // 检查数组项是否有效 + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid item at index %d", i); + cJSON_Delete(root); + return false; // 找到无效项,直接返回 + } + + // 验证并获取各字段 + cJSON *isRead = cJSON_GetObjectItem(item, "isRead"); + cJSON *labelDetails = cJSON_GetObjectItem(item, "labelDetails"); + cJSON *labelTitle = cJSON_GetObjectItem(item, "labelTitle"); + cJSON *timestamp = cJSON_GetObjectItem(item, "timestamp"); + + // 检查必要字段是否存在 + if (!isRead || !cJSON_IsBool(isRead) || + !timestamp || !cJSON_IsNumber(timestamp)) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid message format at index %d", i); + cJSON_Delete(root); + return false; // 找到无效数据格式,直接返回 + } + + // 如果所有必要字段有效,则解析并构造 MessageData + MessageData data; + data.isRead = cJSON_IsTrue(isRead); + + // 允许 labelDetails 和 labelTitle 字段为空字符串 + data.labelDetails = (labelDetails && cJSON_IsString(labelDetails)) ? labelDetails->valuestring : ""; + data.labelTitle = (labelTitle && cJSON_IsString(labelTitle)) ? labelTitle->valuestring : ""; + data.timestamp = timestamp->valuedouble; + + // 处理时间字符串 + char labelTime[20]; + if (uapi_get_TIME_STR(data.timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC) + { + data.labelTime = std::string("--"); + } + else + { + data.labelTime = std::string(labelTime); + } + + MessageVector.push_back(data); + } + + cJSON_Delete(root); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Messages loaded from storage successfully"); + return true; // 所有消息成功加载 } - // 保存Message文件 bool MessageModel::SaveMessagesToStorage() {