wenbo2005.online

学习记录 / STM32

JSON 数据的接收与发送

STM322024-10-26

注意一定要在STM32CubeMX中,将Heap_Size 改为 0x2000,不然json键值大概只有两个,超过将在转化成字符串时失败!!

//=============================================================数据解析

(一),添加库:

#include "cJSON.h"

(二),解析函数(这里解析浮点类型)

void Json_Display(char *json_string)
{
    cJSON *parsed_json = cJSON_Parse(json_string);  
    if (parsed_json == NULL) // 解析失败处理  
    {  
        const char *error_ptr = cJSON_GetErrorPtr();
        if (error_ptr != NULL)
        {
          printf("Parse error before: %s\n", error_ptr);
        }
    return;
    }
    //解析出latitude
    cJSON *latitude = cJSON_GetObjectItem(parsed_json, "latitude");  
    if(latitude != NULL && cJSON_IsNumber(latitude))
    {
        // 使用 cJSON_GetNumberValue 获取浮点数值
        double lat_value = cJSON_GetNumberValue(latitude);
        printf("latitude: %.6f\n", lat_value);  // 输出小数部分
    }
    //解析出longitude
    cJSON *longitude = cJSON_GetObjectItem(parsed_json, "longitude");
    if (longitude != NULL && cJSON_IsNumber(longitude))
    {
        double lon_value = cJSON_GetNumberValue(longitude);
        printf("longitude: %.6f\n", lon_value);  // 输出小数部分
    }
    // 释放解析后的 JSON 对象
    cJSON_Delete(parsed_json);  
}

//======================================================================打包

(一),创建Json对象

    cJSON *pOrder = cJSON_CreateObject();  
    cJSON *params = cJSON_CreateObject();  

(二),判断是否创建失败

    if (pOrder == NULL || params == NULL)  
    {  
            printf("Creat ENV JSONobj Err\n");  
            cJSON_Delete(pOrder);  
            cJSON_Delete(params);  
            return;  
    }  

(三),添加数据

    // 添加参数到params对象,并检查每个调用的返回值  
    if(!cJSON_AddNumberToObject(params,"temp",23.5)||!cJSON_AddNumberToObject(params,"humi",50)||!cJSON_AddNumberToObject(params,"o2",21))
    {
        printf("Add ENV data to JSONobj Err\n");  
        cJSON_Delete(pOrder);  
        cJSON_Delete(params);  
        return;  
    }  

    // 添加params到pOrder对象  
    cJSON_AddStringToObject(pOrder, "name", "environment");  
    cJSON_AddNumberToObject(pOrder, "id", 1);  
    cJSON_AddItemToObject(pOrder, "params", params);//pOrder包含params

    char *json_body = NULL;
    json_body = cJSON_PrintUnformatted(pOrder);

(四),转化成字符串并打印

    // 转换JSON对象为字符串  
    if (json_body == NULL)  
    {  
        printf("Print ENV JSON Err\n");  
        cJSON_Delete(pOrder);  
        return;  
    }

    // 打印并发送JSON字符串
    printf("%s\n", json_body);  

//使用 cJSON_free() 和 cJSON_Delete() 的目的是确保我们正确地释放这些动态分配的内存,以避免内存泄漏导致程序崩溃!!

cJSON_free(json_body);
cJSON_Delete(pOrder);