C 语言将复杂json(含嵌套结构,以及列表)转为结构体
时间: 2023-12-04 10:04:43 浏览: 186
将复杂的 JSON 数据转换为 C 语言中的结构体,可以使用 cJSON 库提供的递归解析方式。以下是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
// 定义嵌套结构体
typedef struct {
int id;
char name[20];
} Course;
typedef struct {
int id;
char name[20];
Course *courses;
int courses_count;
} Student;
// 递归解析 JSON 数据
void parse_json(cJSON *node, Student *student) {
cJSON *item;
cJSON_ArrayForEach(item, node) {
if (cJSON_IsNumber(item) && cJSON_StringIsNumeric(item)) {
student->id = item->valueint;
}
else if (cJSON_IsString(item)) {
strcpy(student->name, item->valuestring);
}
else if (cJSON_IsArray(item)) {
int arr_size = cJSON_GetArraySize(item);
student->courses_count = arr_size;
student->courses = (Course *)malloc(sizeof(Course) * arr_size);
for (int i = 0; i < arr_size; i++) {
cJSON *course_node = cJSON_GetArrayItem(item, i);
Course *course = &(student->courses[i]);
cJSON *id_node = cJSON_GetObjectItem(course_node, "id");
cJSON *name_node = cJSON_GetObjectItem(course_node, "name");
course->id = id_node->valueint;
strcpy(course->name, name_node->valuestring);
}
}
else if (cJSON_IsObject(item)) {
parse_json(item, student);
}
}
}
int main() {
char *json_str = "{\"id\": 123, \"name\": \"John\", \"courses\": [{\"id\": 1, \"name\": \"Math\"}, {\"id\": 2, \"name\": \"English\"}]}";
// 解析 JSON 字符串
cJSON *root = cJSON_Parse(json_str);
// 解析 JSON 并获取数据并赋值给结构体
Student student;
parse_json(root, &student);
// 打印结构体信息
printf("Student: id=%d, name=%s\n", student.id, student.name);
for (int i = 0; i < student.courses_count; i++) {
printf("Course: id=%d, name=%s\n", student.courses[i].id, student.courses[i].name);
}
// 释放结构体内存
free(student.courses);
// 释放 cJSON 对象
cJSON_Delete(root);
return 0;
}
```
上述示例中,我们定义了两个嵌套结构体 Course 和 Student,其中 Student 结构体包含一个 Course 数组。我们使用递归的方式解析 JSON 数据,当遇到数组时,我们需要使用 cJSON_GetArraySize() 函数获取数组长度,然后遍历数组中的每一个元素并分别解析。当遇到对象时,我们递归调用 parse_json() 函数。最后,我们打印了结构体中的信息,并释放了相关内存。
阅读全文