1. cjson库简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端数据传输和存储。在C语言中,我们可以使用cjson库来处理JSON数据。本问总结了在使用cjson库中各个常用API的用法,包括组装JSON(包括对象、数组、字符串等),以及解析JSON(解析对象、数组、字符串等)。
cjson是一个轻量级的C语言库,用于处理JSON数据。它提供了简单易用的API,能够方便地将C语言中的数据转换成JSON格式,以及将JSON格式的数据解析成C语言中的数据。
2. JSON对象的组装
2.1 组装JSON对象
要组装一个JSON对象,可以使用以下API:
//先创建一个cJSON对象头指针
cJSON *cJSON_CreateObject(void);
//添加一个对象到另一个对象,实现嵌套
void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
注意事项:
- 在调用
cJSON_CreateObject
后,返回的指针需要通过cJSON_Delete
进行内存释放,以防止内存泄漏。 - 使用
cJSON_AddItemToObject
将各个子项添加到JSON对象中,其中string
是子项的键名,item
是子项的值,可以是数字、字符串、数组等其他JSON类型。
示例:
{
"age":30
"name" :"John"
"is_student":1
}
#include <stdio.h>
#include "cJSON.h"
int main() {
// 组装JSON对象
cJSON *jsonObj = cJSON_CreateObject();
// 添加数字到JSON对象中
cJSON_AddNumberToObject(jsonObj, "age", 30);
// 添加字符串到JSON对象中
cJSON_AddStringToObject(jsonObj, "name", "John");
// 添加布尔值到JSON对象中,这里用1表示true
cJSON_AddBoolToObject(jsonObj, "is_student", 1);
// 将JSON对象转换成字符串会开辟一个新内存,调用此函数记得手动释放
char *jsonStr = cJSON_Print(jsonObj);
printf("JSON Object:\n%s\n", jsonStr);
// 释放JSON对象的内存
cJSON_Delete(jsonObj);
// 释放JSON字符串的内存
free(jsonStr);
return 0;
}
2.2 组装JSON数组
要组装一个JSON数组,可以使用以下API:
cJSON *cJSON_CreateArray(void);
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
注意事项:
- 在调用
cJSON_CreateArray
后,返回的指针需要通过cJSON_Delete
进行内存释放,以防止内存泄漏。 - 如果将cJSON_CreateArray数组对象添加到其他对象中作为子对象时,只需释放总JSON头部即可。
- 使用
cJSON_AddItemToArray
将各个子项添加到JSON数组中,item
是子项的值,可以是数字、字符串、对象等其他JSON类型。
示例:
{
"logList": [{
"logName": "f1",
"logSize": 1357,
"logTime": "2023-07-24 15:19:25"
}
.....//可添加
]
}
#include <stdio.h>
#include "cJSON.h"
int main() {
// 创建 JSON 格式的根对象
cJSON *root = cJSON_CreateObject();
cJSON *jsonArray = cJSON_CreateArray();
//创建子对象
cJSON *logEntry = cJSON_CreateObject();
cJSON_AddStringToObject(logEntry, "logName", filename);
cJSON_AddStringToObject(logEntry, "logSize", 100);
cJSON_AddStringToObject(logEntry, "logTime","2023-07-24 15:19:25");
//对象的相互嵌套不受顺序影响
//将logentry插入到jsonarray数组中
cJSON_AddItemToArray(jsonArray , logEntry);
//将数组插入到跟对象
cJSON_AddItemToObject(root, "logList", jsonArray );
char *jsonStr = cJSON_Print(root);
printf("JSON Array:\n%s\n", jsonStr);
cJSON_Delete(root); // 释放root内存
free(jsonStr); // 释放jsonStr内存
return 0;
}
3. JSON对象的解析
3.1 解析JSON对象
要解析JSON中的对象,可以使用以下API:
cJSON *cJSON_Parse(const char *value);
cJSON *cJSON_GetObjectItem(const cJSON *object, const char *string);
注意事项:
- 在调用
cJSON_Parse
后,返回的指针需要通过cJSON_Delete
进行内存释放,以防止内存泄漏。 - 使用
cJSON_GetObjectItem
根据键名获取JSON对象中的子项。
示例:
{
"age":30
"name" :"John"
"is_student":true
}
#include <stdio.h>
#include "cJSON.h"
int main() {
const char *jsonStr = "{\"name\":\"John\",\"age\":30,\"is_student\":true}";
cJSON *jsonObj = cJSON_Parse(jsonStr);
if (jsonObj != NULL) {
//解析跟每个子对象的顺序无关
cJSON *nameObj = cJSON_GetObjectItem(jsonObj, "name");
cJSON *ageObj = cJSON_GetObjectItem(jsonObj, "age");
cJSON *isStudentObj = cJSON_GetObjectItem(jsonObj, "is_student");
if (nameObj != NULL && cJSON_IsString(nameObj)) {
printf("Name: %s\n", nameObj->valuestring);
}
if (ageObj != NULL && cJSON_IsNumber(ageObj)) {
printf("Age: %d\n", ageObj->valueint);
}
if (isStudentObj != NULL && cJSON_IsBool(isStudentObj)) {
printf("Is Student: %s\n", isStudentObj->valueint ? "true" : "false");
}
cJSON_Delete(jsonObj); // 释放jsonObj内存
} else {
printf("JSON parsing failed!\n");
}
return 0;
}
3.2 解析JSON数组
要解析JSON中的数组,可以使用以下API:
cJSON *cJSON_Parse(const char *value);
cJSON *cJSON_GetArrayItem(const cJSON *array, int index);
注意事项:
- 在调用
cJSON_Parse
后,返回的指针需要通过cJSON_Delete
进行内存释放,以防止内存泄漏。 - 使用
cJSON_GetArrayItem
根据索引获取JSON数组中的子项。
示例:
{
[ apple,
123,
true
]
}
#include <stdio.h>
#include "cJSON.h"
int main() {
const char *jsonStr = "[\"apple\", 123, true]";
cJSON *jsonArray = cJSON_Parse(jsonStr);
if (jsonArray != NULL && cJSON_IsArray(jsonArray)) {
int arraySize = cJSON_GetArraySize(jsonArray);
for (int i = 0; i < arraySize; i++) {
cJSON *item = cJSON_GetArrayItem(jsonArray, i);
if (cJSON_IsString(item)) {
printf("Array Item %d: %s\n", i, item->valuestring);
} else if (cJSON_IsNumber(item)) {
printf("Array Item %d: %d\n", i, item->valueint);
} else if (cJSON_IsBool(item)) {
printf("Array Item %d: %s\n", i, item->valueint ? "true" : "false");
}
}
cJSON_Delete(jsonArray
); // 释放jsonArray内存
} else {
printf("JSON parsing failed!\n");
}
return 0;
}