一、下载
在学习VSCode开发c语言时,需要用到cJSon库,因此去学习了解了一下如何导入以及使用。在学习的过程中,也借鉴了别人的经验,故记录下来,方便以后查看。
比较好的文章对cJSon库的库函数详细介绍,链接如下:
1.首先下载cJSon库
https://github.com/DaveGamble/cJSON
2.解压之后,找到cJSON.c 和 cJSON.h文件。

二、复制库文件并进行项目配置
1.在项目工程根目录下新建third_party文件夹以及子文件夹cJSON,复制cJSON.c 和 cJSON.h文件到该目录下。

2.在CMakeLists.txt中进行如下路径的配置

三、编写demo
·1.主程序setup_scr_languagescreen_6.c中加入以下代码:
cpp
printf("=== C语言 JSON 处理示例 ===\n\n");
// 示例1:创建 JSON
printf("1. 创建 JSON 对象:\n");
create_user_json();
// 示例2:解析 JSON 字符串
printf("\n2. 解析 JSON 字符串:\n");
parse_json_string();
// 示例3:处理复杂 JSON
printf("\n3. 处理复杂嵌套 JSON:\n");
process_nested_json();
// 示例4:JSON 数组操作
printf("\n4. JSON 数组操作:\n");
json_array_example();
// 示例5:文件操作
printf("\n5. JSON 文件操作:\n");
json_file_operations();
printf("\n程序执行完毕!\n");
2.在events_init.h文件中函数声明:
cpp
#include "../../third_party/cJSON/cJSON.h"
// 函数声明
void create_user_json(void);
void parse_json_string(void);
void process_nested_json(void);
void json_array_example(void);
void json_file_operations(void);
// 工具函数
cJSON* safe_json_parse(const char *text);
char* safe_json_print(const cJSON *item);
3.在events_init.c文件中函数实现:
cpp
#include "../../third_party/cJSON/cJSON.h"
// 创建用户 JSON
void create_user_json(void) {
cJSON *root = cJSON_CreateObject();
// 添加基本字段
cJSON_AddStringToObject(root, "name", "张三");
cJSON_AddNumberToObject(root, "age", 25);
cJSON_AddBoolToObject(root, "is_student", 1);
cJSON_AddStringToObject(root, "email", "zhangsan@example.com");
// 添加数组
cJSON *hobbies = cJSON_CreateArray();
cJSON_AddItemToArray(hobbies, cJSON_CreateString("阅读"));
cJSON_AddItemToArray(hobbies, cJSON_CreateString("编程"));
cJSON_AddItemToArray(hobbies, cJSON_CreateString("音乐"));
cJSON_AddItemToObject(root, "hobbies", hobbies);
// 添加嵌套对象
cJSON *address = cJSON_CreateObject();
cJSON_AddStringToObject(address, "city", "北京");
cJSON_AddStringToObject(address, "district", "朝阳区");
cJSON_AddStringToObject(address, "street", "建国路");
cJSON_AddItemToObject(root, "address", address);
// 格式化输出
char *json_str = cJSON_Print(root);
printf("创建的 JSON:\n%s\n", json_str);
// 清理内存
// free(json_str);
cJSON_Delete(root);
}
// 解析 JSON 字符串
void parse_json_string(void) {
const char *json_string =
"{"
"\"product\": \"笔记本电脑\","
"\"brand\": \"ThinkPad\","
"\"price\": 6999.99,"
"\"in_stock\": true,"
"\"specifications\": [\"16GB RAM\", \"512GB SSD\", \"Intel i7\"]"
"}";
cJSON *root = cJSON_Parse(json_string);
if (root == NULL) {
const char *error_ptr = cJSON_GetErrorPtr();
if (error_ptr != NULL) {
fprintf(stderr, "JSON 解析错误: %s\n", error_ptr);
}
return;
}
// 提取数据
cJSON *product = cJSON_GetObjectItemCaseSensitive(root, "product");
cJSON *brand = cJSON_GetObjectItemCaseSensitive(root, "brand");
cJSON *price = cJSON_GetObjectItemCaseSensitive(root, "price");
cJSON *in_stock = cJSON_GetObjectItemCaseSensitive(root, "in_stock");
cJSON *specs = cJSON_GetObjectItemCaseSensitive(root, "specifications");
printf("产品信息:\n");
if (cJSON_IsString(product)) {
printf(" 产品: %s\n", product->valuestring);
}
if (cJSON_IsString(brand)) {
printf(" 品牌: %s\n", brand->valuestring);
}
if (cJSON_IsNumber(price)) {
printf(" 价格: ¥%.2f\n", price->valuedouble);
}
if (cJSON_IsBool(in_stock)) {
printf(" 有库存: %s\n", cJSON_IsTrue(in_stock) ? "是" : "否");
}
if (cJSON_IsArray(specs)) {
printf(" 规格:\n");
cJSON *spec;
int index = 1;
cJSON_ArrayForEach(spec, specs) {
if (cJSON_IsString(spec)) {
printf(" %d. %s\n", index++, spec->valuestring);
}
}
}
cJSON_Delete(root);
}
// 处理复杂嵌套 JSON
void process_nested_json(void) {
const char *complex_json =
"{"
"\"company\": {"
" \"name\": \"科技有限公司\","
" \"employees\": 150,"
" \"departments\": ["
" {"
" \"name\": \"研发部\","
" \"manager\": \"李四\","
" \"members\": 45"
" },"
" {"
" \"name\": \"销售部\","
" \"manager\": \"王五\","
" \"members\": 30"
" }"
" ]"
"}"
"}";
cJSON *root = cJSON_Parse(complex_json);
if (root == NULL) {
printf("解析复杂 JSON 失败\n");
return;
}
cJSON *company = cJSON_GetObjectItem(root, "company");
if (company) {
cJSON *name = cJSON_GetObjectItem(company, "name");
cJSON *employees = cJSON_GetObjectItem(company, "employees");
cJSON *departments = cJSON_GetObjectItem(company, "departments");
printf("公司信息:\n");
printf(" 名称: %s\n", cJSON_IsString(name) ? name->valuestring : "未知");
printf(" 员工数: %d\n", cJSON_IsNumber(employees) ? employees->valueint : 0);
if (cJSON_IsArray(departments)) {
printf(" 部门:\n");
cJSON *dept;
cJSON_ArrayForEach(dept, departments) {
cJSON *dept_name = cJSON_GetObjectItem(dept, "name");
cJSON *manager = cJSON_GetObjectItem(dept, "manager");
cJSON *members = cJSON_GetObjectItem(dept, "members");
printf(" - %s (经理: %s, 成员: %d人)\n",
cJSON_IsString(dept_name) ? dept_name->valuestring : "未知",
cJSON_IsString(manager) ? manager->valuestring : "未知",
cJSON_IsNumber(members) ? members->valueint : 0);
}
}
}
cJSON_Delete(root);//递归释放 cJSON 对象及其所有子对象占用的内存
}
// JSON 数组操作示例
void json_array_example(void) {
cJSON *root = cJSON_CreateArray();
// 添加多个对象到数组
for (int i = 0; i < 3; i++) {
cJSON *item = cJSON_CreateObject();
char name[50];
snprintf(name, sizeof(name), "用户%d", i + 1);
cJSON_AddStringToObject(item, "name", name);
cJSON_AddNumberToObject(item, "id", 1000 + i);
cJSON_AddBoolToObject(item, "active", i % 2 == 0);
cJSON_AddItemToArray(root, item);
}
char *json_str = cJSON_Print(root);
printf("JSON 数组:\n%s\n", json_str);
cJSON_Delete(root);
}
// JSON 文件操作
void json_file_operations(void) {
// 创建配置 JSON
cJSON *config = cJSON_CreateObject();
cJSON_AddStringToObject(config, "app_name", "我的应用");
cJSON_AddNumberToObject(config, "version", 1.0);
cJSON_AddNumberToObject(config, "max_connections", 100);
cJSON_AddBoolToObject(config, "debug_mode", 1);
cJSON *settings = cJSON_CreateObject();
cJSON_AddNumberToObject(settings, "timeout", 30);
cJSON_AddStringToObject(settings, "language", "zh-CN");
cJSON_AddItemToObject(config, "settings", settings);
// 打印 JSON
char *json_str = cJSON_Print(config);
printf("配置 JSON:\n%s\n", json_str);
// 模拟保存到文件(实际项目中可以写入文件)
printf("JSON 已准备好保存到文件...\n");
cJSON_Delete(config);
}
// 安全的 JSON 解析函数
cJSON* safe_json_parse(const char *text) {
if (text == NULL) {
fprintf(stderr, "错误: 输入文本为空\n");
return NULL;
}
cJSON *json = cJSON_Parse(text);
if (json == NULL) {
const char *error_ptr = cJSON_GetErrorPtr();
if (error_ptr != NULL) {
fprintf(stderr, "JSON 解析错误位置: %s\n", error_ptr);
}
return NULL;
}
return json;
}
// 安全的 JSON 打印函数
char* safe_json_print(const cJSON *item) {
if (item == NULL) {
fprintf(stderr, "错误: 不能打印空的 JSON 项\n");
return NULL;
}
char *json_str = cJSON_Print(item);
if (json_str == NULL) {
fprintf(stderr, "错误: JSON 打印失败\n");
}
return json_str;
}
四、运行
在终端中输出如下图所示:


