增加消息json解析的错误预防处理
authorCaisking <3449750381@qq.com>
Wed, 25 Sep 2024 11:03:17 +0000 (19:03 +0800)
committerCaisking <3449750381@qq.com>
Wed, 25 Sep 2024 11:03:17 +0000 (19:03 +0800)
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp

index 7ed7bff..5b83e40 100644 (file)
@@ -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<char>(file)), std::istreambuf_iterator<char>());
-        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<char>(file)), std::istreambuf_iterator<char>());  
+        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()
     {