速览体育网

Good Luck To You!

如何读取CJSON文件?

cJSON文件读取

如何读取CJSON文件?

在C语言中,使用cJSON库可以方便地读取和解析JSON文件,本文将详细介绍如何使用cJSON库读取JSON文件,并提供相关示例代码和常见问题解答。

一、安装与基本设置

需要确保已经安装了cJSON库,可以通过以下命令从GitHub上克隆并编译cJSON:

git clone https://github.com/DaveGamble/cJSON.git
cd cJSON
make

二、读取JSON文件的步骤

1、包含必要的头文件

    #include "cJSON.h"
    #include <stdio.h>

2、打开文件

    FILE* file = fopen("your_json_file.json", "r");
    if (file == NULL) {
        printf("Failed to open the JSON file.
");
        return -1;
    }

3、读取文件内容并解析JSON

如何读取CJSON文件?

    size_t len = 0;
    fseek(file, 0L, SEEK_END);
    len = ftell(file);
    rewind(file);
    char* json_str = (char*)malloc(len + 1);
    fread(json_str, 1, len, file);
    json_str[len] = '\0';
    fclose(file);

4、解析JSON字符串

    cJSON* root = cJSON_Parse(json_str);
    if (root == NULL) {
        printf("Error parsing JSON: %s
", cJSON_GetErrorPtr());
        free(json_str);
        return -1;
    }

5、访问和处理解析后的JSON数据

    const char* key = "your_key";
    const cJSON* value = cJSON_GetObjectItem(root, key);
    if (value != NULL) {
        printf("Value of '%s': %s
", key, cJSON_Print(value));
    } else {
        printf("Key not found.
");
    }

6、释放资源

    cJSON_Delete(root);
    free(json_str);

三、完整示例代码

以下是一个完整的示例代码,展示了如何读取和解析一个名为data.json的JSON文件:

#include "cJSON.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void read_json() {
    FILE *fp = NULL;
    long len = 0;
    char *data = NULL;
    char filename[] = "data.json";
    // 打开文件
    fp = fopen(filename, "r");
    if (NULL == fp) {
        printf("%s don't exist
", filename);
        return;
    }
    // 指针移到文件末尾
    fseek(fp, 0, SEEK_END);
    // 计算文件长度
    len = ftell(fp);
    // 指针回到文件开头
    fseek(fp, 0, SEEK_SET);
    // 申请堆内存
    data = (char *)malloc(len + 1);
    // 把文件的内容读入data
    fread(data, 1, len, fp);
    // 关闭文件指针
    fclose(fp);
    // 定义cJSON指针 root
    cJSON *root = NULL;
    // 解析数据
    root = cJSON_Parse(data);
    if (!root) {
        printf("Error before: [%s]
", cJSON_GetErrorPtr());
    } else {
        // 返回数组中的项数
        int root_array_size = cJSON_GetArraySize(root);
        printf("root_array_size:%d
", root_array_size);
        // 从对象获取项“string”,不区分大小写。
        cJSON *json1 = cJSON_GetObjectItem(root, "admin");
        cJSON *json2 = cJSON_GetObjectItem(json1, "username");
        printf("username:%s
", json2->valuestring);
        json2 = cJSON_GetObjectItem(json1, "type");
        printf("type:%d
", json2->valueint);
        json2 = cJSON_GetObjectItem(root, "user");
        int json2_array_size = cJSON_GetArraySize(json2);
        int i = 0, j = 0;
        cJSON *item = NULL, *temp1 = NULL, *temp2 = NULL, *temp3 = NULL, *temp4 = NULL;
        char *ptr = NULL;
        int array_size = 0;
        for (i = 0; i < json2_array_size; i++) {
            // 从数组“array”中检索项目编号“item”,如果不成功,则返回NULL。
            item = cJSON_GetArrayItem(json2, i);
            if (!item) {
                //TODO...
            }
            // 将cJSON实体呈现为文本,以便传输/存储,而无需任何格式,完成后释放char*。
            ptr = cJSON_PrintUnformatted(item);
            temp1 = cJSON_Parse(ptr);
            if (!temp1)
                continue;
            temp2 = cJSON_GetObjectItem(temp1, "username");
            printf("username:%s
", temp2->valuestring);
            temp3 = cJSON_GetObjectItem(temp1, "other");
            array_size = cJSON_GetArraySize(temp3);
            for (j = 0; j < array_size; j++) {
                temp4 = cJSON_GetArrayItem(temp3, j);
                printf("other[%d]:%d
", j, temp4->valueint);
                // int num[2] = {0, 1};
                / / 释放临时变量内存空间 / / free(num); // 注意不要重复释放内存空间,否则程序会崩溃!
            }
            // 清理临时变量内存空间,防止内存泄漏 / / free(temp1); / / free(temp2); / / free(temp3); / / free(temp4); / / free(ptr); // 注意不要重复释放内存空间,否则程序会崩溃!
        }
        // 清理临时变量内存空间,防止内存泄漏 / / free(temp1); / / free(temp2); / / free(temp3); / / free(temp4); / / free(ptr); // 注意不要重复释放内存空间,否则程序会崩溃!
    }
}

四、常见问题解答(FAQs)

Q1:如何读取JSON文件中的特定键值对?

如何读取CJSON文件?

A1:要读取JSON文件中的特定键值对,可以使用cJSON_GetObjectItem函数,假设要读取键为"username"的值,可以这样做:

const char* key = "username";
const cJSON* value = cJSON_GetObjectItem(root, key);
if (value != NULL) {
    printf("Value of '%s': %s
", key, cJSON_Print(value));
} else {
    printf("Key not found.
");
}

Q2:如何处理解析错误?

A2:如果解析过程中出现错误,可以使用cJSON_GetErrorPtr函数获取错误信息。

if (!root) {
    printf("Error parsing JSON: %s
", cJSON_GetErrorPtr());
}

以上就是关于“cjson文件读取”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!

  •  静静
     发布于 2024-06-29 08:45:03  回复该评论
  • 企业级服务深入浅出,助力企业管理升级,真正实现高效运作。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接

Powered By Z-BlogPHP 1.7.4

Copyright Your WebSite.Some Rights Reserved.