在C语言中如何遍历JSON数组并获取其长度
在C语言中处理JSON数据通常需要借助第三方库,因为C语言本身没有内置的JSON解析功能,本文将介绍如何使用流行的C JSON库(如cJSON)来遍历JSON数组并获取其长度。
选择合适的JSON库
在C语言中,常用的JSON库包括:
- cJSON:轻量级、单文件、易使用的JSON解析器
- Jansson:功能更全面,但需要额外链接
- YAJL:流式解析器,适合处理大文件
本文以cJSON为例进行讲解,因为它简单易用且无需额外依赖。
安装和引入cJSON
- 从cJSON官方仓库下载源码(https://github.com/DaveGamble/cJSON)
- 将cJSON.c和cJSON.h添加到你的项目中
- 包含头文件:
#include "cJSON.h"
解析JSON并获取数组长度
假设我们有以下JSON数组:
[
"apple",
"banana",
"orange",
"grape"
]
解析JSON字符串
#include <stdio.h>
#include <string.h>
#include "cJSON.h"
int main() {
const char* json_string = "[\"apple\", \"banana\", \"orange\", \"grape\"]";
// 解析JSON字符串
cJSON* json = cJSON_Parse(json_string);
if (json == NULL) {
printf("Error parsing JSON: %s\n", cJSON_GetErrorPtr());
return 1;
}
// 检查是否为数组
if (!cJSON_IsArray(json)) {
printf("Root element is not an array\n");
cJSON_Delete(json);
return 1;
}
// 获取数组长度
int array_length = cJSON_GetArraySize(json);
printf("Array length: %d\n", array_length);
// 遍历数组
for (int i = 0; i < array_length; i++) {
cJSON* item = cJSON_GetArrayItem(json, i);
if (cJSON_IsString(item)) {
printf("Item %d: %s\n", i, item->valuestring);
}
}
// 释放内存
cJSON_Delete(json);
return 0;
}
关键函数说明
cJSON_Parse():解析JSON字符串,返回cJSON对象指针cJSON_IsArray():检查cJSON对象是否为数组cJSON_GetArraySize():获取数组长度cJSON_GetArrayItem():获取数组中指定索引的元素cJSON_Delete():释放cJSON对象及其子对象占用的内存
遍历JSON数组的其他方法
除了使用索引遍历,还可以使用cJSON的链表结构直接遍历:
cJSON* item = NULL;
cJSON_ArrayForEach(item, json) {
if (cJSON_IsString(item)) {
printf("Item: %s\n", item->valuestring);
}
}
这种方法更简洁,但不如索引遍历灵活。
错误处理
在实际应用中,完善的错误处理非常重要:
if (json == NULL) {
printf("Error parsing JSON: %s\n", cJSON_GetErrorPtr());
return 1;
}
if (!cJSON_IsArray(json)) {
printf("Expected JSON array\n");
cJSON_Delete(json);
return 1;
}
int array_length = cJSON_GetArraySize(json);
if (array_length < 0) {
printf("Invalid array length\n");
cJSON_Delete(json);
return 1;
}
完整示例
以下是一个更完整的示例,包含从文件读取JSON和错误处理:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"
int main() {
FILE* file = fopen("data.json", "r");
if (file == NULL) {
perror("Failed to open file");
return 1;
}
fseek(file, 0, SEEK_END);
long file_size = ftell(file);
fseek(file, 0, SEEK_SET);
char* json_buffer = (char*)malloc(file_size + 1);
if (json_buffer == NULL) {
perror("Memory allocation failed");
fclose(file);
return 1;
}
fread(json_buffer, 1, file_size, file);
json_buffer[file_size] = '\0';
fclose(file);
cJSON* json = cJSON_Parse(json_buffer);
free(json_buffer);
if (json == NULL) {
printf("Error parsing JSON: %s\n", cJSON_GetErrorPtr());
return 1;
}
if (!cJSON_IsArray(json)) {
printf("Root element is not an array\n");
cJSON_Delete(json);
return 1;
}
printf("Array length: %d\n", cJSON_GetArraySize(json));
cJSON* item = NULL;
int index = 0;
cJSON_ArrayForEach(item, json) {
if (cJSON_IsString(item)) {
printf("[%d] %s\n", index++, item->valuestring);
} else if (cJSON_IsNumber(item)) {
printf("[%d] %g\n", index++, item->valuedouble);
} else {
printf("[%d] (other type)\n", index++);
}
}
cJSON_Delete(json);
return 0;
}
在C语言中处理JSON数组需要借助第三方库,cJSON是一个简单易用的选择,要遍历JSON数组并获取其长度,主要步骤包括:
- 使用
cJSON_Parse()解析JSON字符串 - 使用
cJSON_IsArray()验证是否为数组 - 使用
cJSON_GetArraySize()获取数组长度 - 使用
cJSON_GetArrayItem()或cJSON_ArrayForEach()遍历数组元素 - 最后使用
cJSON_Delete()释放内存
记住始终进行错误检查,特别是在处理外部输入时,以确保程序的健壮性。



还没有评论,来说两句吧...