cjson常用API使用总结

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值