C/C++中CJSON使用指南:从解析到生成实战

为什么选择CJSON处理JSON数据

搞C/C++项目时,经常要和JSON数据打交道。配置文件、网络传输、API交互都离不开它。CJSON这个轻量级库就是专门为C语言设计的JSON解析器,只有单个头文件,不依赖第三方库,嵌入式设备也能跑得飞起。相比那些臃肿的解决方案,它就像瑞士军刀般精巧实用。

C-C  中CJSON怎么用

快速集成CJSON到你的项目

首先去GitHub下载cJSON.hcJSON.c两个核心文件。扔进工程目录后,只需在代码里加一行:

#include “cJSON.h”

编译时记得把cJSON.c加入构建列表。Linux下用gcc可以这样操作:

gcc main.c cJSON.c -o json_parser -lm

注意末尾的-lm是链接数学库,处理数字类型时必须的。

四步搞定JSON解析

假设要解析这段数据:

{
name": "智能传感器",
id": 42,
active": true
}

分解操作步骤:

  • 步骤1:用cJSON_Parse加载字符串
  • 步骤2:通过cJSON_GetObjectItem按字段名提取值
  • 步骤3:用cJSON_IsXXX系列函数校验数据类型
  • 步骤4:用cJSON_Delete释放内存

具体实现像这样:

cJSON *root = cJSON_Parse(raw_data);
cJSON *name = cJSON_GetObjectItem(root, "name");
printf("设备名: %s
, name->valuestring);

玩转嵌套数据结构

遇到多层嵌套JSON怎么办?比如:

{
device": {
config": {
timeout": 30,
retries": 3
}

逐层解析别慌张:

cJSON *config = cJSON_GetObjectItem(
cJSON_GetObjectItem(root, "device"),
config
);
int timeout = cJSON_GetObjectItem(config, "timeout")->valueint;

处理数组也很直观。假设有个传感器数组:

cJSON *sensors = cJSON_GetObjectItem(root, "sensors");
int count = cJSON_GetArraySize(sensors);
for(int i=0; i<count; i++) {
cJSON *sensor = cJSON_GetArrayItem(sensors, i);
// 处理每个传感器...
}

动态构建JSON对象

创建JSON数据就像搭积木。先建根对象:

cJSON *report = cJSON_CreateObject;

接着添加各种类型数据:

数据类型 创建函数 示例
字符串 cJSON_CreateString cJSON_AddItemToObject(report, “status”, cJSON_CreateString(“OK”))
数字 cJSON_CreateNumber cJSON_AddItemToObject(report, “temp”, cJSON_CreateNumber(36.5))
数组 cJSON_CreateArray cJSON *arr = cJSON_CreateArray;

最后生成字符串:

char *json_str = cJSON_Print(report);
// 发送或保存json_str
free(json_str); // 别忘释放!

避坑指南:常见问题解决

新手常踩这几个雷区:

  • 内存泄漏cJSON_Print生成的字符串必须手动free
  • 类型误判:数字12.0可能被解析成整数,用cJSON_IsNumber更保险
  • 空指针:解析失败时cJSON_Parse返回NULL,记得检查

调试时打开cJSON_InitHooks自定义内存管理,能快速定位内存问题。

实战:物联网设备通信案例

假设我们要让嵌入式设备上报状态:

cJSON *root = cJSON_CreateObject;
cJSON_AddItemToObject(root, "device_id", cJSON_CreateString("ESP32_001"));
cJSON *data = cJSON_CreateObject;
cJSON_AddItemToObject(data, "voltage", cJSON_CreateNumber(3.3));
cJSON_AddItemToObject(data, "signal", cJSON_CreateNumber(85));
cJSON_AddItemToObject(root, "telemetry", data);
char *payload = cJSON_PrintUnformatted(root); // 无空格节省流量
send_to_server(payload);
cJSON_Delete(root);
free(payload);

服务器返回的配置指令也能轻松解析:

if(cJSON_HasObjectItem(response, "update_interval")) {
int interval = cJSON_GetObjectItem(response, "update_interval")->valueint;
set_sampling_rate(interval);
}

整个过程就像在组装乐高积木,每块数据都严丝合缝。

内容均以整理官方公开资料,价格可能随活动调整,请以购买页面显示为准,如涉侵权,请联系客服处理。

本文由星速云发布。发布者:星速云。禁止采集与转载行为,违者必究。出处:https://www.67wa.com/149925.html

(0)
上一篇 2026年1月20日 上午5:08
下一篇 2026年1月20日 上午5:09
联系我们
关注微信
关注微信
分享本页
返回顶部