当前位置: 首页 > 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 文件,然后在读取内容值。

http://www.xdnf.cn/news/768583.html

相关文章:

  • uniapp路由跳转toolbar页面
  • 为何ERP系统更倾向使用业务编码作为主键?兼顾可读性与系统集成的设计思考
  • 【Zephyr 系列 3】多线程与调度机制:让你的 MCU 同时干多件事
  • oracle sql 语句 优化方法
  • 数据库系统概论(十三)详细讲解SQL中数据更新(插入,修改与更新)
  • RocketMQ 消息发送核心源码解析:DefaultMQProducerImpl.send () 方法深度剖析
  • 前端开发知识体系全景指南
  • 小目标检测:YOLOV7改进之双坐标注意力(DCA)
  • Python Day41
  • 神经网络与深度学习(第一章)
  • 链式前向星图解
  • 排序算法C语言实现
  • Linux配置DockerHub镜像源配置
  • Qt实现的水波进度条和温度进度条
  • 神经网络中的梯度消失与梯度爆炸
  • cnn训练并用grad-cam可视化
  • 基于遥感图像深度学习的海洋测深
  • 2024年数维杯国际大学生数学建模挑战赛C题时间信号脉冲定时噪声抑制与大气时延抑制模型解题全过程论文及程序
  • 题目 3230: 蓝桥杯2024年第十五届省赛真题-星际旅行
  • [蓝桥杯]约瑟夫环
  • web架构2------(nginx多站点配置,include配置文件,日志,basic认证,ssl认证)
  • 2025年5月24日系统架构设计师考试题目回顾
  • 【RAG 应用的可视化框架】
  • 【C++】类的构造函数
  • 【iOS(swift)笔记-13】App版本不升级时本地数据库sqlite更新逻辑一
  • 软件测评师教程 第2章 软件测试基础 笔记
  • 大数据-275 Spark MLib - 基础介绍 机器学习算法 集成学习 随机森铃 Bagging Boosting
  • 【C++进阶篇】C++11新特性(上篇)
  • 【笔记】在 Clang 工具链中降级 NumPy 到 2.2.4
  • JavaWeb预习(jsp)