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:

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文件中的特定键值对?

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文件读取”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!