在 VSCode 中:引入开源cJSon解析库+示例demo
一、下载
在学习VSCode开发c语言时,需要用到cJSon库,因此去学习了解了一下如何导入以及使用。在学习的过程中,也借鉴了别人的经验,故记录下来,方便以后查看。
比较好的文章对cJSon库的库函数详细介绍,链接如下:
https://blog.csdn.net/pjwshuai/article/details/125007434?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-125007434-blog-111356443.235^v43^pc_blog_bottom_relevance_base6&spm=1001.2101.3001.4242.3&utm_relevant_index=7
https://blog.csdn.net/qq_23274715/article/details/105800488?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-105800488-blog-111251934.235^v43^pc_blog_bottom_relevance_base6&spm=1001.2101.3001.4242.3&utm_relevant_index=7
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中加入以下代码:
printf("=== C语言 JSON 处理示例 ===\n\n");// 示例1:创建 JSONprintf("1. 创建 JSON 对象:\n");create_user_json();// 示例2:解析 JSON 字符串printf("\n2. 解析 JSON 字符串:\n");parse_json_string();// 示例3:处理复杂 JSONprintf("\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文件中函数声明:
#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文件中函数实现:
#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) {// 创建配置 JSONcJSON *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);// 打印 JSONchar *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;
}
四、运行
在终端中输出如下图所示:



