在 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中加入以下代码:

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;
}

四、运行

在终端中输出如下图所示:

相关推荐
ii_best3 小时前
安卓/IOS工具开发基础教程:按键精灵一个简单的文字识别游戏验证
android·开发语言·游戏·ios·编辑器
我命由我123454 小时前
IDEA - IDEA 快速回到页面首尾、页面快速滑动、快速定位到指定行
java·运维·ide·后端·java-ee·intellij-idea·intellij idea
Mickyจุ๊บ4 小时前
IDEA 插件推荐
java·ide·intellij-idea
命运之光4 小时前
【快速解决】idea运行javafx错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
java·ide·intellij-idea
Qrun6 小时前
Windows11安装nvm管理node多版本
前端·vscode·react.js·ajax·npm·html5
mrsyf17 小时前
VSCode中Copilot的询问、编辑、代理有啥区别?
ide·vscode·copilot
你很易烊千玺18 小时前
处理wangEditor编辑器缩进问题
编辑器
晨尘光21 小时前
【pycharm 创建一个线程,在线程函数中增加的日志打印,日志打印了,但是打断点进不去】
ide·python·pycharm