当前位置: 首页 > news >正文

cJSON简单使用

文章目录

    • 1. 背景
    • 2. cjson 使用
      • 2.1 CJSON 源码下载
      • 2.2 cJson 数据结构介绍
      • 📌 1. **`struct cJSON *next`, `*prev`**
      • 📌 2. **`struct cJSON *child`**
      • 📌 3. **`int type`**
      • 📌 4. **`char *valuestring`**
      • 📌 5. **`int valueint`** 与 **`double valuedouble`**
      • 📌 6. **`char *string`**
      • 2.3 常用函数介绍
        • 1. **cJSON_AddNumberToObject 函数**
        • 2.**cJSON_AddStringToObject** 函数
        • 3. **cJSON_AddTrueToObject**函数
        • 4. **cJSON_AddFalseToObject**函数
        • 5. **cJSON_AddBoolToObject**函数
        • 6. **cJSON_AddObjectToObject** 函数
        • 7. **cJSON_AddArrayToObject** 函数
        • 8.**cJSON_Parse** 函数
        • 9. **cJSON_GetObjectItem** 函数
        • 10. **cJSON_GetArrayItem** 函数
        • 11. **cJSON_Print** 函数
    • 3. 简单使用

cJSON简单使用

1. 背景

设备工作中,经常会使用一些配置文件,用来指导某些用户配置。我们手机里面的配置就是最常见的例子。简单的配置文件可能没有什么规则,按照使用习惯生成读取就行。对于稍微多一点的配置,就需要按照一定的规则了,且要尽可能符合人类读取和识别的习惯。

常见的有xml和json配置文件,这2种配置文件应用都很广泛,都都有成熟的库进行支持。

下面大致来进行二者的比较:

维度JSONXML
结构与语法键值对形式,类似编程语言中的对象。 示例:{"name": "Alice", "age": 30}嵌套标签结构,类似文档格式。 示例:<name>Alice</name><age>30</age>
可读性更简洁紧凑,易于人工阅读和编写。标签冗余度高,但层次结构更清晰(尤其复杂数据)。
解析性能解析速度更快,数据体积小(节省带宽)。解析较慢(尤其大文件),占用更多内存和带宽。
扩展性灵活性高,但缺乏复杂验证机制。支持命名空间、DTD/XSD验证,适合复杂数据结构和严格约束。
安全性相对更安全(但仍需防范注入攻击)。存在XML注入等风险,需额外防护。
数据类型支持原生支持数组、布尔值、null等。需通过标签属性模拟复杂类型,灵活性较低。

应用场景推荐:

场景推荐格式理由
Web API & 移动应用✅ JSON轻量、解析快,完美契合RESTful API和前后端分离架构。
企业级系统集成✅XML需严格数据验证(如XSD)、命名空间防冲突(如多部门数据合并)。
实时数据传输✅ JSON低延迟需求(如物联网传感器数据)。
文档存储与发布✅XML适合电子书、标准化报告(如PubMed期刊)。
配置文件⚖视复杂度定简单配置用JSON(如VSCode设置),复杂依赖用XML(如Spring Bean定义)。

2. cjson 使用

从上面可以看到,json 适合轻量应用,本次就简单使用 cJSON 源码进行简单的介绍 JSON 配置文件使用。

2.1 CJSON 源码下载

CJSON源码请到个人 gitee仓库进行下载

2.2 cJson 数据结构介绍

cJSON.h 中声明了 cjson对象的数据结构,如下:

/* The cJSON structure: */
typedef struct cJSON
{/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */struct cJSON *next;struct cJSON *prev;/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */struct cJSON *child;/* The type of the item, as above. */int type;/* The item's string, if type==cJSON_String  and type == cJSON_Raw */char *valuestring;/* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */int valueint;/* The item's number, if type==cJSON_Number */double valuedouble;/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */char *string;
} cJSON;

📌 1. struct cJSON *next, *prev

  • 作用:构成双向链表,指向同一层级的下一个/上一个节点。

  • 适用场景:遍历数组(Array)或对象(Object)中的同级元素时使用。

  • 示例:若解析 [1, “a”, true] 三个元素通过 next/prev 进行连接。

📌 2. struct cJSON *child

  • 作用:指向子节点(下一层级)。

  • 适用场景:仅当节点类型为 cJSON_Object(对象)或 cJSON_Array(数组)时有效。

  • 示例:对象 {“name”: “John”}中,键 "name"对应的值节点是对象的子节点。

📌 3. int type

  • 作用:标识节点类型,以位标志(bit-flag)存储。需通过cJSON_IsXxx()函数判断类型

  • 常见类型值:

    宏定义说明
    cJSON_False0布尔值 false
    cJSON_True1布尔值 true
    cJSON_NULL2null
    cJSON_Number3数值(整数或浮点数)
    cJSON_String4字符串
    cJSON_Array5数组
    cJSON_Object6对象
    cJSON_Raw7原始 JSON 字符串(未解析)
    cJSON_IsReference256子节点或值为引用(不释放内存)
    cJSON_StringIsConst512键名是字面量(不释放内存)

📌 4. char *valuestring

  • 作用:存储字符串类型(cJSON_String)或原始 JSON(cJSON_Raw)的值。

  • 注意:以 \0 结尾,需通过 cJSON_IsString()验证类型后使用。

📌 5. int valueintdouble valuedouble

  • 作用:存储数值类型(cJSON_Number)的值。

  • 注意:

  • 数值会同时存储valueintvaluedouble 中。

  • 若数值超出整型范围,``valueint会被设为 INT_MAXINT_MIN`。

  • 建议通过cJSON_GetNumberValue()获取值。

📌 6. char *string

  • 作用:存储键值对中的键名(Key)
  • 注意:仅当节点是对象的子节点时有效(如 {"key": value} 中的 "key"

2.3 常用函数介绍

1. cJSON_AddNumberToObject 函数
cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number)
  • 功能:将数字值添加到JSON对象中。
  • 参数:
    • object - 目标JSON对象。
    • name - 要添加的键的名称(C字符串)。
    • number - 要添加的双精度浮点数。
  • 返回值:无。
2.cJSON_AddStringToObject 函数
cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string)
  • 功能:将字符串值添加到JSON对象中。
  • 参数:
    • object - 目标JSON对象。
    • name - 要添加的键的名称(C字符串)。
    • string - 要添加的C字符串。
  • 返回值:无。
3. cJSON_AddTrueToObject函数
cJSON_AddTrueToObject(cJSON * const object, const char * const name)
  • 功能:将true值添加到JSON对象中。
  • 参数:
    • object - 目标JSON对象。
    • name - 要添加的键的名称(C字符串)。
  • 返回值:无。
4. cJSON_AddFalseToObject函数
cJSON_AddFalseToObject(cJSON * const object, const char * const name)
  • 功能:将false值添加到JSON对象中。
  • 参数:
    • object - 目标JSON对象。
    • name - 要添加的键的名称(C字符串)。
  • 返回值:无。
5. cJSON_AddBoolToObject函数
cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean)
  • 功能:将布尔值添加到JSON对象中。
  • 参数:
    • object - 目标JSON对象。
    • name - 要添加的键的名称(C字符串)。
    • boolean - 要添加的布尔值,非零表示true,零表示false。
  • 返回值:无
6. cJSON_AddObjectToObject 函数
cJSON_AddObjectToObject(cJSON * const object, const char * const name)
  • 功能:创建一个新的JSON对象,并将其添加到父JSON对象中作为子对象。
  • 参数:
    • object - 目标JSON对象。
    • name - 要添加的键的名称(C字符串)。
  • 返回值:无。
7. cJSON_AddArrayToObject 函数
cJSON_AddArrayToObject(cJSON * const object, const char * const name)
  • 功能:创建一个新的JSON数组,并将其添加到父JSON对象中作为子数组。
  • 参数:
    • object - 目标JSON对象。
    • name - 要添加的键的名称(C字符串)。
  • 返回值:无。
8.cJSON_Parse 函数
cJSON_Parse(const char *value)
  • 功能:将JSON字符串解析为相应的JSON对象或数组。
  • 参数:value - 包含JSON数据的C字符串。
  • 返回值:返回一个指向解析后的JSON对象或数组的指针。如果解析失败,返回NULL。
9. cJSON_GetObjectItem 函数
cJSON_GetObjectItem(const cJSON *object, const char *string)
  • 功能:获取JSON对象中指定键的值。
  • 参数:
    • object - 目标JSON对象。
    • string - 要获取值的键的名称(C字符串)。
  • 返回值:返回一个指向值的JSON对象或NULL(如果键不存在)。
10. cJSON_GetArrayItem 函数
cJSON_GetArrayItem(const cJSON *array, int index)
  • 功能:获取JSON数组中指定索引位置的元素。
  • 参数:
    • array - 目标JSON数组。
    • index - 要获取的元素的索引(从0开始)。
  • 返回值:返回一个指向元素的JSON对象或NULL(如果索引越界)。
11. cJSON_Print 函数
cJSON_Print(const cJSON *item)
  • 生成JSON配置文件格式字符串
  • 参数:
    • item:目标JSON对象
  • 返回值:返回一个字符串格式的配置文件内容。

3. 简单使用

具体实例参考 本人 gitee cjson使用 中 srcinclude 目录,大致功能是先简单生成一个.json 文件,然后在读取内容值。

相关文章:

  • 前端面试高频问题通关指南--通用性问题
  • 洛谷-P3912素数个数题解
  • window/linux ollama部署模型
  • IPtables部署和使用
  • 基于LangChain的AI助手开发:从零到上线
  • Alist Win 基本用法
  • 强化学习-深度学习和强化学习领域
  • 第十二节:第四部分:集合框架:List系列集合:LinkedList集合的底层原理、特有方法、栈、队列
  • 【C语言】C语言经典小游戏:贪吃蛇(上)
  • 【操作系统·windows快捷键指令】
  • 第二十一章 格式化输出
  • 16.FreeRTOS
  • make_unique
  • 启动metastore时报错MetaException(message:Version information not found in metastore
  • NodeJS全栈WEB3面试题——P7工具链 测试
  • 池中锦鲤的自我修养,聊聊蓄水池算法
  • 代码随想录算法训练营第六天| 242.有效的字母异位词 、 349. 两个数组的交集 、 202. 快乐数 、1. 两数之和
  • 2023年12月6级第一套第一篇
  • 英文投资理财源码挖矿源码投资理财系统源码(源码下载)
  • 线程安全与线程池
  • 头像代做网站/西地那非片能延时多久有副作用吗
  • 张家港普通网站建设/如何交换友情链接
  • 免费网站建设特色/宁德市古田县
  • 网站与建设实训报告/百度站长seo
  • 手机网站设计开发服务/新闻 近期大事件
  • 如何利用问答类网站做推广/seo外链优化培训