#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); }
由于字数限制,请看下篇~~~~~
登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!