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种配置文件应用都很广泛,都都有成熟的库进行支持。

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

维度 JSON XML
结构与语法 键值对形式,类似编程语言中的对象。 示例:{"name": "Alice", "age": 30} 嵌套标签结构,类似文档格式。 示例:Alice30
可读性 更简洁紧凑,易于人工阅读和编写。 标签冗余度高,但层次结构更清晰(尤其复杂数据)。
解析性能 解析速度更快,数据体积小(节省带宽)。 解析较慢(尤其大文件),占用更多内存和带宽。
扩展性 灵活性高,但缺乏复杂验证机制。 支持命名空间、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_False 0 布尔值 false
    cJSON_True 1 布尔值 true
    cJSON_NULL 2 null
    cJSON_Number 3 数值(整数或浮点数)
    cJSON_String 4 字符串
    cJSON_Array 5 数组
    cJSON_Object 6 对象
    cJSON_Raw 7 原始 JSON 字符串(未解析)
    cJSON_IsReference 256 子节点或值为引用(不释放内存)
    cJSON_StringIsConst 512 键名是字面量(不释放内存)

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 文件,然后在读取内容值。

你可能感兴趣的:(Linux,工具,C,运维)