#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);
}
由于字数限制,请看下篇~~~~~

登录 或 注册 后才可以进行评论哦!
还没有评论,抢个沙发!