增加心率血氧json解析的错误预防处理 1017/1
authorCaisking <3449750381@qq.com>
Wed, 25 Sep 2024 11:03:27 +0000 (19:03 +0800)
committerCaisking <3449750381@qq.com>
Wed, 25 Sep 2024 11:03:27 +0000 (19:03 +0800)
code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp

index 6d9550e..4067f52 100644 (file)
@@ -113,128 +113,167 @@ namespace OHOS
     static constexpr const char *HEART_JSON_PATH = "/user/userdata/health/heart.json";
     static constexpr const char *BLOOD_JSON_PATH = "/user/userdata/health/blood.json";
 
-    // 读取血氧数据
-    BloodOxygenData *HealthService::ReadBloodOxygenData()
-    {
-        // 判断文件夹是否存在
-        if (!CreateHealthFolder())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");
-            return nullptr;
-        }
-
-        // 读取文件
-        std::ifstream inFile(BLOOD_JSON_PATH);
-        if (!inFile.is_open())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file");
-            return nullptr;
-        }
-
-        // 读取文件内容到字符串
-        std::stringstream buffer;
-        buffer << inFile.rdbuf();
-        std::string jsonDataString = buffer.str();
-        const char *jsonData = jsonDataString.c_str();
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData);
-
-        // 关闭文件
-        inFile.close();
-
-        if (jsonDataString.empty())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");
-            return nullptr;
-        }
-
-        cJSON *oxygen_root = cJSON_Parse(jsonData);
-        if (oxygen_root == NULL)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "oxygen_root is empty");
-            return nullptr;
-        }
-
-        BloodOxygenData *data = new BloodOxygenData();
-
-        cJSON *value_item = cJSON_GetObjectItem(oxygen_root, "value");
-        cJSON *timestamp_item = cJSON_GetObjectItem(oxygen_root, "timestamp");
-
-        if (value_item && timestamp_item)
-        {
-            data->SPO2 = value_item->valueint;
-            data->timestamp = timestamp_item->valuedouble;
-        }
-        else
-        {
-            // 读取的数据异常
-            cJSON_Delete(oxygen_root);
-            delete data;
-            return nullptr;
-        }
-        cJSON_Delete(oxygen_root);
-        return data;
+    // 读取血氧数据  
+    BloodOxygenData *HealthService::ReadBloodOxygenData()  
+    {  
+        // 判断文件夹是否存在  
+        if (!CreateHealthFolder())  
+        {  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create health folder");  
+            return nullptr;  
+        }  
+
+        // 读取文件  
+        std::ifstream inFile(BLOOD_JSON_PATH);  
+        if (!inFile.is_open())  
+        {  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file");  
+            return nullptr;  
+        }  
+
+        // 读取文件内容到字符串  
+        std::stringstream buffer;  
+        buffer << inFile.rdbuf();  
+        std::string jsonDataString = buffer.str();  
+        const char *jsonData = jsonDataString.c_str();  
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData);  
+
+        // 关闭文件  
+        inFile.close();  
+
+        if (jsonDataString.empty())  
+        {  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");  
+            return nullptr;  
+        }  
+
+        cJSON *oxygen_root = cJSON_Parse(jsonData);  
+        if (oxygen_root == NULL)  
+        {  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to parse JSON data");  
+            return nullptr;  
+        }  
+
+        BloodOxygenData *data = new BloodOxygenData();  
+
+        cJSON *value_item = cJSON_GetObjectItem(oxygen_root, "value");  
+        cJSON *timestamp_item = cJSON_GetObjectItem(oxygen_root, "timestamp");  
+
+        // 检查是否存在必要字段,并验证数据类型  
+        if (value_item && cJSON_IsNumber(value_item) && timestamp_item && cJSON_IsNumber(timestamp_item))  
+        {  
+            data->SPO2 = value_item->valueint;  
+            data->timestamp = timestamp_item->valuedouble;  
+
+            // 进一步验证数据的合理性  
+            if (data->SPO2 < 0 || data->SPO2 > 100)  // 血氧饱和度范围是0-100  
+            {  
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid SPO2 value: %d", data->SPO2);  
+                cJSON_Delete(oxygen_root);  
+                delete data;  
+                return nullptr;  
+            }  
+        }  
+        else  
+        {  
+            // 读取的数据异常  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Missing or invalid data fields");  
+            cJSON_Delete(oxygen_root);  
+            delete data;  
+            return nullptr;  
+        }  
+
+        cJSON_Delete(oxygen_root);  
+        return data;  
     }
-    // 读取心率数据
-    HeartRateData *HealthService::ReadHeartRateData()
-    {
-        // 判断文件夹是否存在
-        if (!CreateHealthFolder())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateHealthFolder file");
-            return nullptr;
-        }
-
-        // 读取文件
-        std::ifstream inFile(HEART_JSON_PATH);
-        if (!inFile.is_open())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file");
-            // 创建一个默认值为 0的数据 存储到json里面 ?
-            return nullptr;
-        }
-
-        // 读取文件内容到字符串
-        std::stringstream buffer;
-        buffer << inFile.rdbuf();
-        std::string jsonDataString = buffer.str();
-        const char *jsonData = jsonDataString.c_str();
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData);
-
-        // 关闭文件
-        inFile.close();
-
-        if (jsonDataString.empty())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");
-            return nullptr;
-        }
-
-        cJSON *heart_root = cJSON_Parse(jsonData);
-        if (heart_root == NULL)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heart_root is empty");
-            return nullptr;
-        }
 
-        HeartRateData *data = new HeartRateData();
-
-        cJSON *value_item = cJSON_GetObjectItem(heart_root, "value");
-        cJSON *timestamp_item = cJSON_GetObjectItem(heart_root, "timestamp");
-
-        if (value_item && timestamp_item)
-        {
-            data->Heart = value_item->valueint;
-            data->timestamp = timestamp_item->valuedouble;
-        }
-        else
-        {
-            // 读取的数据异常
-            cJSON_Delete(heart_root);
-            delete data;
-            return nullptr;
-        }
-        cJSON_Delete(heart_root);
-        return data;
+    // 读取心率数据  
+    HeartRateData *HealthService::ReadHeartRateData()  
+    {  
+        // 判断文件夹是否存在  
+        if (!CreateHealthFolder())  
+        {  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create health folder");  
+            return nullptr;  
+        }  
+
+        // 读取文件  
+        std::ifstream inFile(HEART_JSON_PATH);  
+        if (!inFile.is_open())  
+        {  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open JSON file, creating default data");  
+            
+            // 创建默认值为 0 的数据并存储到 JSON 文件  
+            HeartRateData defaultData;  
+            defaultData.Heart = 0;  // 默认心率值  
+            defaultData.timestamp = static_cast<double>(time(nullptr));  // 当前时间戳  
+
+            // 创建 JSON 对象并写入文件  
+            cJSON *defaultRoot = cJSON_CreateObject();  
+            cJSON_AddNumberToObject(defaultRoot, "value", defaultData.Heart);  
+            cJSON_AddNumberToObject(defaultRoot, "timestamp", defaultData.timestamp);  
+
+            // 写入 JSON 文件  
+            FILE *file = fopen(HEART_JSON_PATH, "w");  
+            if (file)  
+            {  
+                char *jsonString = cJSON_Print(defaultRoot);  
+                fprintf(file, "%s", jsonString);  
+                fclose(file);  
+                free(jsonString);  
+            }  
+            cJSON_Delete(defaultRoot);  
+
+            // 返回默认数据  
+            HeartRateData *data = new HeartRateData(defaultData);  
+            return data;  
+        }  
+
+        // 读取文件内容到字符串  
+        std::stringstream buffer;  
+        buffer << inFile.rdbuf();  
+        std::string jsonDataString = buffer.str();  
+        const char *jsonData = jsonDataString.c_str();  
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData: %s", jsonData);  
+
+        // 关闭文件  
+        inFile.close();  
+
+        if (jsonDataString.empty())  
+        {  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonDataString is empty");  
+            return nullptr;  
+        }  
+
+        cJSON *heart_root = cJSON_Parse(jsonData);  
+        if (heart_root == NULL)  
+        {  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to parse JSON data");  
+            return nullptr;  
+        }  
+
+        HeartRateData *data = new HeartRateData();  
+
+        cJSON *value_item = cJSON_GetObjectItem(heart_root, "value");  
+        cJSON *timestamp_item = cJSON_GetObjectItem(heart_root, "timestamp");  
+
+        // 检查是否存在必要字段,并验证数据类型  
+        if (value_item && cJSON_IsNumber(value_item) && timestamp_item && cJSON_IsNumber(timestamp_item))  
+        {  
+            data->Heart = value_item->valueint;  
+            data->timestamp = timestamp_item->valuedouble;  
+        }  
+        else  
+        {  
+            // 读取的数据异常  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Missing or invalid data fields");  
+            cJSON_Delete(heart_root);  
+            delete data;  
+            return nullptr;  
+        }  
+
+        cJSON_Delete(heart_root);  
+        return data;  
     }
     // 保存血氧数据
     bool HealthService::UpdateHealthData(const BloodOxygenData &data)