cJSON基础介绍-简单使用样例

json的基础介绍

​ JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范) 的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。json常用于对象的序列化,和反序列化。

cJSON的核心实现机制

​ 在C环境中使用json需要导入 cjson库,简单介绍一下其内部的工作原理。

​ 在cJSON库中,最重要的两块分别为JSON解析和JSON节点的增删改查。

​ 使用树结构存储JSON的各个节点。而这个JSON树是使用双向链表实现的。例如

    {
   
         "name": "Jack (\"Bee\") Nimble", 
         "format": {
   "type":       "rect", 
         "width":      1920, 
         "height":     1080, 
         "interlace":  false,
         "frame rate": 24
    }

​ 双向链表的每一个节点都是cJSON指针。一个完整的双向链表表示一连串兄弟节点。在示例JSON中,name和format节点组合成一个 链表,type,width,height,interlace和frame rate节点组成一个链表。

​ JSON树的每一层都是一个双向链表,表示一堆兄弟节点。当前层的所有节点都是当前链表头节点的父节点的子节点。在示例JSON 中,type,width,height,interlace和frame rate节点都是format节点的子节点。实线表示节点间有真实的引用关系,而虚线表示 逻辑上的引用关系。

​ JSON正反词法分析,具体的词法分析流程不做介绍

​ 正向词法分析:将字符串文本(char *)转换为JSON树。

​ 反向词法分析:将JSON树转换为可存储打印的字符串文本(char *)。

cJSON的内存管理

​ cJSON库提供了钩子函数来帮助用户自定义内存管理函数,如果不设置,这默认为malloc和free。

自动模式下的内存管理

​ 在自动模式下,cJSON使用默认的malloc和free函数管理内存。
​ 在cJSON中,每个节点都是malloc而来,每个节点的string和valuestring也是malloc而来。
​ 使用cJSON库中,使用cJSON_Delete函数可以递归释放JSON树中malloc的节点内存和字符内存。
​ 当使用cJSON_Print函数后,需要手动释放cJSON_Print函数分配的内存,避免内存泄露。

手动模式下的内存管理

​ 在手动模式下,需要指定钩子cJSON_Hooks的指向。cJSON_Hooks结构如下:

        typedef struct cJSON_Hooks 
		{
   
            void *(*malloc_fn)(size_t sz);
            void (*free_fn)(void *ptr);
        } cJSON_Hooks;

​ 只要通过cJSON_Hooks指定了内存分配和释放的函数,在之后的使用中将自动使用指定的函数进行内存分配和释放。

​ 假设已经有了一个自定义的内存分配函数my_malloc, 内存释放函数my_free。使用如下:

        cJSON_InitHooks *hooks = NULL;
        hooks = (cJSON_InitHooks *)calloc(1, sizeof(cJSON_InitHooks));
        hooks
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
UC/OS-II 是一个实时操作系统,而 cJSON 是一个轻量级的 JSON 解析器和生成器库。如果你想在 UC/OS-II 中使用 cJSON,你需要将 cJSON 的源代码添加到你的项目中,并进行相应的配置。 以下是在 UC/OS-II 中使用 cJSON 的一般步骤: 1. 将 cJSON 的源代码添加到你的 UC/OS-II 项目中。可以将 cJSON 的源文件(cJSON.c 和 cJSON.h)直接复制到你的项目目录中,或者将其放在一个单独的文件夹中,并将该文件夹添加到你的项目的 include 路径中。 2. 在你的 UC/OS-II 任务中包含 cJSON 头文件,并在任务初始化的地方进行 cJSON 的初始化。例如,你可以在任务初始化函数中调用 `cJSON_Init()` 函数来初始化 cJSON: ```c #include "cJSON.h" void YourTask(void *p_arg) { // 初始化 cJSON cJSON_Init(); // 其他任务代码... } ``` 3. 在你的任务中使用 cJSON 解析和生成 JSON 数据。你可以使用 cJSON 的 API 来解析和生成 JSON 数据。例如,使用 `cJSON_Parse()` 函数解析 JSON 字符串,使用 `cJSON_CreateObject()` 和 `cJSON_AddItemToObject()` 函数创建和添加 JSON 对象等。 以下是一个简单的例子,演示了如何使用 cJSON 解析和生成 JSON 数据: ```c #include "cJSON.h" void YourTask(void *p_arg) { cJSON *root = NULL; char *jsonStr = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; // 解析 JSON 字符串 root = cJSON_Parse(jsonStr); if (root != NULL) { // 从 JSON 对象中获取字段值 cJSON *name = cJSON_GetObjectItem(root, "name"); cJSON *age = cJSON_GetObjectItem(root, "age"); cJSON *city = cJSON_GetObjectItem(root, "city"); if (name != NULL && age != NULL && city != NULL) { // 打印字段值 printf("Name: %s\n", name->valuestring); printf("Age: %d\n", age->valueint); printf("City: %s\n", city->valuestring); } // 释放 cJSON 对象 cJSON_Delete(root); } // 生成 JSON 对象 cJSON *newRoot = cJSON_CreateObject(); cJSON_AddStringToObject(newRoot, "name", "Alice"); cJSON_AddNumberToObject(newRoot, "age", 25); cJSON_AddStringToObject(newRoot, "city", "London"); // 将 JSON 对象转换为字符串 char *newJsonStr = cJSON_Print(newRoot); if (newJsonStr != NULL) { printf("New JSON string: %s\n", newJsonStr); free(newJsonStr); } // 释放 cJSON 对象 cJSON_Delete(newRoot); // 其他任务代码... } ``` 这只是一个简单的示例,你可以根据你的具体需求使用其他 cJSON 的 API 来解析和生成 JSON 数据。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值