在使用 cJSON 库时,我们经常需要处理 JSON 数据的接收和解析,cJSON 是一个轻量级的 JSON 解析库,适用于 C 语言开发,它提供了一组简单的 API,用于将 JSON 数据转换为 C 结构体,以及将 C 结构体转换为 JSON 字符串。

假设我们有一个 JSON 数据如下:
{
"name": "John",
"age": 30,
"is_student": false,
"address": {
"city": "New York",
"zipcode": "10001"
},
"courses": ["Math", "Science", "History"]
}我们需要使用 cJSON 库来解析这个 JSON 数据,我们需要包含 cJSON 头文件,并定义一个结构体来表示地址信息:
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
typedef struct {
char *city;
char *zipcode;
} Address;
typedef struct {
char *name;
int age;
int is_student;
Address address;
char **courses;
int courses_count;
} Person;我们编写一个函数来解析 JSON 数据并将其填充到 Person 结构体中:
Person parse_json(const char *json_str) {
cJSON *json = cJSON_Parse(json_str);
if (json == NULL) {
const char *error_ptr = cJSON_GetErrorPtr();
if (error_ptr != NULL) {
fprintf(stderr, "Error before: %s
", error_ptr);
}
return (Person){NULL};
}
Person person;
person.name = cJSON_GetStringValue(cJSON_GetObjectItem(json, "name"));
person.age = cJSON_GetNumberValue(cJSON_GetObjectItem(json, "age"));
person.is_student = cJSON_IsTrue(cJSON_GetObjectItem(json, "is_student"));
cJSON *address_json = cJSON_GetObjectItem(json, "address");
person.address.city = cJSON_GetStringValue(cJSON_GetObjectItem(address_json, "city"));
person.address.zipcode = cJSON_GetStringValue(cJSON_GetObjectItem(address_json, "zipcode"));
cJSON *courses_json = cJSON_GetArrayItem(cJSON_GetObjectItem(json, "courses"));
person.courses = malloc(cJSON_GetArraySize(courses_json) * sizeof(char *));
person.courses_count = cJSON_GetArraySize(courses_json);
for (int i = 0; i < person.courses_count; i++) {
person.courses[i] = cJSON_GetStringValue(cJSON_GetArrayItem(courses_json, i));
}
cJSON_Delete(json);
return person;
}在主函数中,我们可以调用这个解析函数并打印解析后的结果:
int main() {
const char *json_str = "{\"name\": \"John\", \"age\": 30, \"is_student\": false, \"address\": {\"city\": \"New York\", \"zipcode\": \"10001\"}, \"courses\": [\"Math\", \"Science\", \"History\"]}";
Person person = parse_json(json_str);
printf("Name: %s
", person.name);
printf("Age: %d
", person.age);
printf("Is student: %d
", person.is_student);
printf("City: %s
", person.address.city);
printf("Zipcode: %s
", person.address.zipcode);
printf("Courses:
");
for (int i = 0; i < person.courses_count; i++) {
printf(" %s
", person.courses[i]);
}
// Free allocated memory
free(person.courses);
return 0;
}FAQs
Q1: 如何安装 cJSON 库?
A1: 你可以通过以下步骤安装 cJSON 库:
1、下载 cJSON 源代码:https://github.com/DaveGamble/cJSON

2、解压下载的文件。
3、进入解压后的目录,编译源代码,在 Linux 系统上,你可以使用以下命令:
gcc -o example example.c cJSON.c -I.
4、运行生成的可执行文件。
Q2: cJSON 支持哪些数据类型?
A2: cJSON 支持以下数据类型:
字符串(char)
数字(double)

布尔值(int)
数组(cJSON)
对象(cJSON)
NULL(cJSON_NULL)
小伙伴们,上文介绍了“cjson接收例子”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。