cJSON学习笔记

这篇博客介绍了如何安装和使用cJSON库,包括组包、解包和解包与可变参数的处理。重点讨论了通过优化内存分配来提升cJSON性能,如在堆上预定义缓冲区以加速malloc和free操作。测试结果显示在树莓派4B上进行了1000000次循环的性能测试。

安装

https://github.com/DaveGamble/cJSON

组包

#include <stdio.h>
#include "cJSON.h"

int main(){
   
   
    // 创建dict结点
    cJSON *root = cJSON_CreateObject();

    // 添加string子节点
    cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble"));

    // 添加number子节点
    cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(20));

    // 添加bool子节点
    cJSON_AddItemToObject(root, "best", cJSON_CreateBool(cJSON_True));

    // 添加bool子节点
    cJSON_AddItemToObject(root, "worse", cJSON_CreateFalse());

    // 添加NULL子节点
    cJSON_AddItemToObject(root, "address", cJSON_CreateNull());

    // 添加array
    cJSON *string_array = cJSON_CreateArray();
    cJSON_AddItemToObject(string_array,"hello",cJSON_CreateString("hello"));
    cJSON_AddItemToObject(string_array,"world",cJSON_CreateString("world"));
    cJSON_AddItemToObject(root,"string",string_array);

    // 添加array
    int nums[] = {
   
   1,2,3,4,5,6};
    cJSON *nums_array = cJSON_CreateIntArray(nums,sizeof(nums)/sizeof(int));
    cJSON_AddItemToObject(root,"nums",nums_array);

    // 格式化输出, 调用malloc
    printf("%s\n",cJSON_Print(root));

    // 非格式化输出, 调用malloc
    printf("%s\n",cJSON_PrintUnformatted(root));

    // 不调用malloc
    char buffer[4096] = {
   
   0};
    cJSON_PrintPreallocated(root,buffer,sizeof(buffer),0);//0 非格式化, 1格式化
    printf("%s\n",buffer);

    // 删除节点, 如果直接调用cJSON_Delete删除某个节点, print的时候会出错的
    cJSON_DeleteItemFromObjectCaseSensitive(root,"age");// 大小写敏感
    // cJSON_DeleteItemFromObject// 大小写不敏感

    // 更新节点
    cJSON_ReplaceItemInObjectCaseSensitive(root,"name",cJSON_CreateString("小明"));// 大小写敏感
    // cJSON_ReplaceItemInObject// 大小写不敏感

    // 格式化输出, 调用malloc
    printf("%s\n",cJSON_Print(root));

    // 删除根节点
    cJSON_Delete(root);
}

解包

#include <stdio.h>
#include "cJSON.h"

int main(){
   
   
    char s[] = "{\"name\":\"Jack (\\\"Bee\\\") Nimble\",\"age\":20,\"best\":true,\"worse\":false,\"address\":null,\"string\":[\"hello\",\"world\"],\"nums\":[1,2,3,4,5,6]}";

    cJSON *root, *object, *sub_object;
    
 
### cJSON库成员函数使用方法 cJSON库提供了丰富的成员函数来处理JSON数据,包括创建、解析、修改和打印JSON对象等操作。以下是一些常用的成员函数及其使用方法: #### 创建JSON对象 要创建一个JSON对象,可以使用`cJSON_CreateObject`函数[^4]: ```c cJSON *root = cJSON_CreateObject(); ``` #### 添加键值对到JSON对象 可以使用宏函数`cJSON_AddItemToObject`来向JSON对象中添加键值对。例如,添加一个字符串类型的键值对: ```c cJSON_AddItemToObject(root, "name", cJSON_CreateString("John Doe")); ``` 同样地,可以添加其他类型的数据如数字、布尔值等: ```c cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(30)); cJSON_AddItemToObject(root, "isMember", cJSON_CreateBool(1)); // 1表示true, 0表示false ``` #### 解析JSON数据 解析JSON数据可以使用`cJSON_Parse`函数,它接受一个JSON格式的字符串并返回一个指向`cJSON`结构体的指针: ```c const char *json_str = "{\"name\":\"John Doe\", \"age\":30, \"isMember\":true}"; cJSON *parsed_json = cJSON_Parse(json_str); if (parsed_json == NULL) { // 处理错误 } ``` #### 获取JSON对象中的字段 一旦JSON数据被解析成`cJSON`对象,就可以通过`cJSON_GetObjectItemCaseSensitive`函数来获取特定的字段: ```c cJSON *name_item = cJSON_GetObjectItemCaseSensitive(parsed_json, "name"); if (cJSON_IsString(name_item) && (name_item->valuestring != NULL)) { printf("Name: %s\n", name_item->valuestring); } ``` #### 创建和打印JSON数组 创建JSON数组可以使用`cJSON_CreateArray`函数,然后使用`cJSON_AddItemToArray`来添加元素到数组中: ```c cJSON *array = cJSON_CreateArray(); cJSON_AddItemToArray(array, cJSON_CreateNumber(1)); cJSON_AddItemToArray(array, cJSON_CreateNumber(2)); cJSON_AddItemToArray(array, cJSON_CreateNumber(3)); char *array_str = cJSON_Print(array); printf("Array: %s\n", array_str); cJSON_free(array_str); ``` #### 从文件解析JSON 从文件读取JSON数据首先需要将文件内容加载到内存中的字符串,然后使用`cJSON_Parse`来解析这个字符串。 #### 生成JSON文件 生成JSON文件可以通过`cJSON_Print`函数将`cJSON`对象转换为字符串,然后将该字符串写入文件。 ### 完整示例 下面是一个完整的示例,展示如何创建一个包含多个字段的JSON对象,并将其打印出来: ```c #include "cJSON.h" #include <stdio.h> int main() { cJSON *root = cJSON_CreateObject(); cJSON_AddItemToObject(root, "name", cJSON_CreateString("John Doe")); cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(30)); cJSON_AddItemToObject(root, "isMember", cJSON_CreateBool(1)); cJSON *hobbies = cJSON_CreateArray(); cJSON_AddItemToArray(hobbies, cJSON_CreateString("reading")); cJSON_AddItemToArray(hobbies, cJSON_CreateString("gaming")); cJSON_AddItemToObject(root, "hobbies", hobbies); char *json_str = cJSON_Print(root); printf("JSON: %s\n", json_str); cJSON_free(json_str); cJSON_Delete(root); return 0; } ``` 编译时需要链接数学库,因为cJSON库依赖于它: ```shell gcc your_file.c cJSON.c -lm ``` 以上就是cJSON库的一些基本成员函数的使用方法。通过这些函数,可以方便地处理JSON数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值