切换主题
cJSON使用笔记
cJSON
是一个轻量级的 C 语言 JSON 解析库,适用于需要处理 JSON 数据的嵌入式系统或者对内存和资源有限的环境。下面是一些常见的 cJSON
使用笔记,包括基本的功能、示例和常见问题的解决方法。
1. cJSON 的基本使用
1.1. 引入头文件和链接库
c
#include "cJSON.h"
1
1.2. 创建 JSON 对象
- 使用
cJSON_CreateObject
创建一个 JSON 对象。
c
cJSON *json = cJSON_CreateObject();
1
1.3. 创建 JSON 数组
- 使用
cJSON_CreateArray
创建一个 JSON 数组。
c
cJSON *json_array = cJSON_CreateArray();
1
1.4. 添加键值对
- 使用
cJSON_AddItemToObject
或者cJSON_AddStringToObject
等函数向 JSON 对象添加键值对。
c
cJSON_AddStringToObject(json, "name", "John");
cJSON_AddNumberToObject(json, "age", 25);
1
2
2
1.5. 添加元素到 JSON 数组
- 使用
cJSON_AddItemToArray
向 JSON 数组中添加元素。
c
cJSON_AddItemToArray(json_array, cJSON_CreateString("apple"));
cJSON_AddItemToArray(json_array, cJSON_CreateString("banana"));
1
2
2
1.6. 输出 JSON 字符串
- 使用
cJSON_Print
或cJSON_PrintUnformatted
输出 JSON 对象。
c
char *json_string = cJSON_Print(json);
printf("%s\n", json_string);
1
2
2
2. 解析 JSON 数据
2.1. 解析 JSON 字符串
- 使用
cJSON_Parse
解析 JSON 字符串。
c
const char *json_string = "{\"name\": \"John\", \"age\": 25}";
cJSON *json = cJSON_Parse(json_string);
1
2
2
2.2. 获取值
- 使用
cJSON_GetObjectItemCaseSensitive
获取对象中的键值。
c
cJSON *name = cJSON_GetObjectItemCaseSensitive(json, "name");
if (cJSON_IsString(name) && (name->valuestring != NULL)) {
printf("Name: %s\n", name->valuestring);
}
1
2
3
4
2
3
4
2.3. 获取数组中的元素
- 使用
cJSON_GetArrayItem
获取数组中的元素。
c
cJSON *first_item = cJSON_GetArrayItem(json_array, 0);
if (cJSON_IsString(first_item) && (first_item->valuestring != NULL)) {
printf("First item: %s\n", first_item->valuestring);
}
1
2
3
4
2
3
4
3. 销毁 JSON 对象
3.1. 销毁 JSON 对象
- 使用
cJSON_Delete
销毁 JSON 对象,释放内存。
c
cJSON_Delete(json);
1
4. 示例:创建和解析 JSON
c
#include <stdio.h>
#include "cJSON.h"
int main() {
// 创建一个 JSON 对象
cJSON *json = cJSON_CreateObject();
// 添加数据
cJSON_AddStringToObject(json, "name", "John");
cJSON_AddNumberToObject(json, "age", 25);
// 创建一个数组
cJSON *json_array = cJSON_CreateArray();
cJSON_AddItemToArray(json_array, cJSON_CreateString("apple"));
cJSON_AddItemToArray(json_array, cJSON_CreateString("banana"));
cJSON_AddItemToObject(json, "fruits", json_array);
// 输出 JSON
char *json_string = cJSON_Print(json);
printf("Generated JSON:\n%s\n", json_string);
// 解析 JSON
const char *json_data = "{\"name\":\"John\", \"age\":25}";
cJSON *parsed_json = cJSON_Parse(json_data);
cJSON *name = cJSON_GetObjectItemCaseSensitive(parsed_json, "name");
cJSON *age = cJSON_GetObjectItemCaseSensitive(parsed_json, "age");
if (cJSON_IsString(name) && (name->valuestring != NULL)) {
printf("Parsed Name: %s\n", name->valuestring);
}
if (cJSON_IsNumber(age)) {
printf("Parsed Age: %d\n", age->valueint);
}
// 销毁 JSON 对象
cJSON_Delete(json);
cJSON_Delete(parsed_json);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
5. 常见问题与解决
5.1. 解析失败
- 当
cJSON_Parse
解析失败时,可以使用cJSON_GetErrorPtr
获取错误指针,定位错误位置。
c
cJSON *json = cJSON_Parse(invalid_json_string);
if (!json) {
const char *error_ptr = cJSON_GetErrorPtr();
printf("Error before: %s\n", error_ptr);
}
1
2
3
4
5
2
3
4
5
5.2. 内存泄漏
- 在创建 JSON 对象时,确保在不需要时调用
cJSON_Delete
来释放内存。
5.3. 无法获取 JSON 值
- 检查键名是否正确,大小写敏感,确保值的类型匹配。
c
cJSON *item = cJSON_GetObjectItemCaseSensitive(json, "key");
if (item != NULL && cJSON_IsString(item)) {
printf("Value: %s\n", item->valuestring);
}
1
2
3
4
2
3
4
6. 小结
cJSON
是一个非常简洁的 JSON 解析库,适合嵌入式系统及 C 语言项目。在使用时,重点在于创建 JSON 对象、解析 JSON 字符串、正确处理内存和类型匹配。它提供了丰富的 API 来创建和访问 JSON 数据,可以满足大多数简单的 JSON 操作需求。