#DIY设计##创享2025##嘉立创##畅聊专区#


今天跟大家聊聊json这玩意,json说实在的bug菌也是后面联网的项目越来越多才用上了这玩意,玩物联网和智能硬件的朋友应该用得比较多。这不最近一个"小项目"又把这玩意拿过来用用,整体还是挺舒适的,主要是json易读也比较容易把握,那顺便聊聊吧~


1、什么是cjson



在资源受限的单片机上解析JSON,开发者常面临内存不足、解析性能差等问题,所以在单片机上用cjson比较合适,一款专为嵌入式设计的开源JSON解析库,设计简洁高效,用得挺多的。

下面简单介绍下cjson:

cJSON是由Dave Gamble开发的超轻量级C语言JSON解析库,代码仅一个.h和一个.c文件,完全开源,专为嵌入式环境优化。

 GitHub地址:

https://github.com/DaveGamble/cJSON

核心特点

• 极简内存占用:解析时仅需几KB内存,适合RAM稀缺的单片机(如STM32F103、ESP8266)。

• 纯C实现:无第三方依赖,跨平台支持(Keil、IAR、GCC均可编译),就两个文件,移植起来太简单了。

• 易用性:API简洁,10分钟即可上手。

• 灵活性:支持动态创建、修改、序列化和反序列化JSON数据。

下面是简单的cjson使用示例 :

1. 示例代码:创建JSON并输出字符串

#include"cJSON.h"

voidcreate_json(void){
    // 1. 创建根对象
    cJSON *root = cJSON_CreateObject();
    
    // 2. 添加键值对
    cJSON_AddStringToObject(root, "device", "ESP32");
    cJSON_AddNumberToObject(root, "temperature", 25.6);
    
    // 3. 添加嵌套对象
    cJSON *location = cJSON_CreateObject();
    cJSON_AddNumberToObject(location, "lat", 35.6895);
    cJSON_AddNumberToObject(location, "lon", 139.6917);
    cJSON_AddItemToObject(root, "location", location);

    // 4. 生成JSON字符串
    char *json_str = cJSON_Print(root);
    printf("JSON: %s\n", json_str);

    // 5. 释放内存(重要!)
    free(json_str);
    cJSON_Delete(root);
}

输出结果

{
  "device": "ESP32",
  "temperature": 25.6,
  "location": {
    "lat": 35.6895,
    "lon": 139.6917
  }
}

2. 解析JSON数据

voidparse_json(constchar *json_str){
    cJSON *root = cJSON_Parse(json_str);
    if (root == NULL) {
        printf("JSON解析失败!\n");
        return;
    }

    // 提取字段
    cJSON *device = cJSON_GetObjectItem(root, "device");
    cJSON *temp = cJSON_GetObjectItem(root, "temperature");
    cJSON *location = cJSON_GetObjectItem(root, "location");
    
    printf("设备名: %s, 温度: %.1f\n", device->valuestring, temp->valuedouble);
    printf("经纬度: (%.4f, %.4f)\n", 
           cJSON_GetObjectItem(location, "lat")->valuedouble,
           cJSON_GetObjectItem(location, "lon")->valuedouble);

    cJSON_Delete(root);
}


由于字数限制,请看下篇~~~~~

#DIY设计#
#创享2025#
#嘉立创#
#畅聊专区#
硬创社

还没有评论,抢个沙发!