当前位置:网站首页 > Haskell函数式编程 > 正文

cjson库函数(库函数stdio)



JSON与序列化和反序列化

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它以易于阅读和编写的文本形式表示结构化数据。JSON 格式广泛用于将数据从一个应用程序传输到另一个应用程序,特别是在Web应用程序中,因为它与JavaScript兼容,容易在客户端和服务器之间进行数据交换。

JSON 数据由两种主要结构构成:

  1. 对象 (Object):对象由一对大括号 包围,内部包含一个或多个键值对(key-value pairs)。每个键值对中,键是字符串,值可以是字符串、数字、布尔值、数组、对象或者 null。键和值之间用冒号 分隔,键值对之间用逗号 分隔。

    例如:

     
  2. 数组 (Array):数组由一对方括号 包围,内部包含一个或多个值,这些值可以是字符串、数字、布尔值、对象、数组或 null。数组中的值之间用逗号 分隔。

    例如:

     

序列化和反序列化是将数据从一种格式转换为另一种格式的过程:

  1. 序列化:序列化是将数据结构(如对象或数组)转换为 JSON 字符串的过程。在编程中,这通常用于将数据转换为可以在网络上传输或存储在文件中的格式。

    例如,在JavaScript中,使用 方法可以将一个对象或数组序列化为JSON字符串:

     

    这将生成以下JSON字符串:

     
  2. 反序列化:反序列化是将JSON字符串转换回原始数据结构的过程。这通常用于从网络或文件中读取JSON数据并将其还原为可供程序使用的数据结构。

    在JavaScript中,使用 方法可以将JSON字符串反序列化为原始对象或数组:

     

    这将把JSON字符串还原为一个包含相同数据的对象。

总之,JSON 是一种常用的数据格式,序列化和反序列化是将数据转换为JSON格式以及将其还原回原始数据结构的重要过程,用于数据交换和持久化存储。

cJSON(C语言JSON)库介绍

cJSON(C语言JSON)库是一个用于在C语言中解析和生成JSON数据的轻量级开源库。

仓库地址

 

它提供了简单而强大的API,使C语言程序能够轻松地处理JSON数据。cJSON库的主要特点包括:

  1. 轻量级:cJSON库非常小巧,因此它不会增加太多的内存开销或二进制文件大小,适用于嵌入式系统和资源受限的环境。
  2. 易于使用:cJSON提供了一组简单的API函数,使用户能够轻松地解析和生成JSON数据。这些API包括创建JSON对象、数组、字符串、数字等,以及将JSON数据解析成C语言数据结构。
  3. 跨平台:cJSON库是跨平台的,可以在多种操作系统和编译器上运行,因此适用于各种C语言项目。
  4. 开源:cJSON是开源的,允许用户免费使用和修改它,符合自由软件和开源软件的原则。
  5. 支持标准的JSON格式:cJSON库支持标准的JSON格式,可以正确处理JSON对象、数组、字符串、数字、布尔值和null等基本JSON数据类型。

以下是cJSON库的一些基本用法示例:

创建JSON对象和添加键值对

 

创建JSON数组和添加元素

 

将JSON数据解析成C语言数据结构

 

生成JSON字符串

 

需要注意的是,使用cJSON库时,应该小心处理内存分配和释放,以避免内存泄漏。cJSON提供了一些用于释放JSON对象的函数,以确保在使用完JSON数据后正确释放相关内存。

cJSON库通常用于C语言项目中需要与JSON数据进行交互的情况,例如与API通信、配置文件解析和生成等。由于其轻量级和易用性,它在许多C语言应用程序中得到了广泛的应用。

cJSON(C语言JSON)库使用

下载出来的文件会有很多 但是真正用到的就是只有cJSON.h cJSON.c

 

将文件放到项目目录下 包含cJSON.h就可以使用了

序列化
常用函数介绍
  1. cJSON_AddNullToObject(cJSON * const object, const char * const name)
    • 功能:将一个null值添加到JSON对象中。
    • 参数:
      • - 目标JSON对象。
      • - 要添加的键的名称(C字符串)。
    • 返回值:无。
  2. cJSON_AddTrueToObject(cJSON * const object, const char * const name)
    • 功能:将true值添加到JSON对象中。
    • 参数:
      • - 目标JSON对象。
      • - 要添加的键的名称(C字符串)。
    • 返回值:无。
  3. cJSON_AddFalseToObject(cJSON * const object, const char * const name)
    • 功能:将false值添加到JSON对象中。
    • 参数:
      • - 目标JSON对象。
      • - 要添加的键的名称(C字符串)。
    • 返回值:无。
  4. cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean)
    • 功能:将布尔值添加到JSON对象中。
    • 参数:
      • - 目标JSON对象。
      • - 要添加的键的名称(C字符串)。
      • - 要添加的布尔值,非零表示true,零表示false。
    • 返回值:无。
  5. cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number)
    • 功能:将数字值添加到JSON对象中。
    • 参数:
      • - 目标JSON对象。
      • - 要添加的键的名称(C字符串)。
      • - 要添加的双精度浮点数。
    • 返回值:无。
  6. cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string)
    • 功能:将字符串值添加到JSON对象中。
    • 参数:
      • - 目标JSON对象。
      • - 要添加的键的名称(C字符串)。
      • - 要添加的C字符串。
    • 返回值:无。
  7. cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw)
    • 功能:将原始JSON字符串添加到JSON对象中。这个方法允许您将已经是有效JSON的原始字符串添加到对象中,而不会进行额外的解析。
    • 参数:
      • - 目标JSON对象。
      • - 要添加的键的名称(C字符串)。
      • - 要添加的原始JSON字符串。
    • 返回值:无。
  8. cJSON_AddObjectToObject(cJSON * const object, const char * const name)
    • 功能:创建一个新的JSON对象,并将其添加到父JSON对象中作为子对象。
    • 参数:
      • - 目标JSON对象。
      • - 要添加的键的名称(C字符串)。
    • 返回值:无。
  9. cJSON_AddArrayToObject(cJSON * const object, const char * const name)
    • 功能:创建一个新的JSON数组,并将其添加到父JSON对象中作为子数组。
    • 参数:
      • - 目标JSON对象。
      • - 要添加的键的名称(C字符串)。
    • 返回值:无。
实例代码
 

编译并运行
请添加图片描述

反序列化
常用函数介绍

在cJSON库中,反序d列化是指将JSON字符串解析为C语言数据结构的过程。cJSON库提供了一些函数来实现这个过程,其中最常用的函数是 。以下是关于这个函数的详细解释以及其他相关函数:

  1. cJSON_Parse(const char *value)
    • 功能:将JSON字符串解析为相应的JSON对象或数组。
    • 参数: - 包含JSON数据的C字符串。
    • 返回值:返回一个指向解析后的JSON对象或数组的指针。如果解析失败,返回NULL。

    示例:

     
  2. cJSON_GetObjectItem(const cJSON *object, const char *string)
    • 功能:获取JSON对象中指定键的值。
    • 参数:
      • - 目标JSON对象。
      • - 要获取值的键的名称(C字符串)。
    • 返回值:返回一个指向值的JSON对象或NULL(如果键不存在)。

    示例:

     
  3. cJSON_GetArrayItem(const cJSON *array, int index)
    • 功能:获取JSON数组中指定索引位置的元素。
    • 参数:
      • - 目标JSON数组。
      • - 要获取的元素的索引(从0开始)。
    • 返回值:返回一个指向元素的JSON对象或NULL(如果索引越界)。

    示例:

     
  4. cJSON_GetArraySize(const cJSON *array)
    • 功能:获取JSON数组的大小(元素数量)。
    • 参数: - 目标JSON数组。
    • 返回值:返回数组的大小。

    示例:

     

这些函数使您能够在解析JSON字符串后,轻松地访问和提取JSON数据的值,以便在C语言程序中使用。要确保在使用完JSON数据后,通过 函数释放相关内存,以避免内存泄漏。

实例代码
 

编译并运行
请添加图片描述

使用注意事项

在使用cJSON库时,需要特别注意内存管理问题,以避免内存泄漏或内存溢出。以下是在使用cJSON库时可能涉及的一些内存问题和如何处理它们的建议:

  1. 内存分配
    • cJSON库在创建和操作JSON对象时会涉及内存分配。您需要确保在使用、 和其他创建函数时分配足够的内存。
    • 在嵌入式系统中,资源可能有限,因此要小心分配内存的数量和时机,以避免耗尽内存。
  2. 释放内存
    • 在不再需要JSON对象时,应使用 函数来释放内存。否则,可能会导致内存泄漏。
    • 确保释放嵌套的JSON对象以及数组元素的内存,以防止漏掉任何子对象。
  3. 释放序列化后的字符串内存
    • 使用 函数将JSON对象序列化为字符串后,需要负责释放字符串内存,以免出现内存泄漏。
    • 使用 函数释放这些字符串内存。
  4. 错误处理
    • 在分配内存和使用cJSON函数时,始终检查返回的指针是否为NULL。如果分配内存失败或解析JSON字符串失败,及时处理错误情况。
  5. 栈内存和堆内存
    • 考虑JSON对象的大小,小型JSON对象可以分配在栈上,而大型对象可能需要在堆上分配内存。要根据实际情况选择合适的内存分配方式。
  6. 嵌套和循环引用
    • 当涉及到嵌套JSON对象时,要小心处理循环引用。循环引用可能导致内存泄漏或无限递归。
    • 考虑使用引用计数或其他手段来管理嵌套对象的内存释放。
  7. 内存池
    • 对于资源受限的嵌入式系统,您可以考虑实现一个内存池来管理cJSON库的内存分配。这可以帮助您更好地控制和优化内存使用。
 

这个示例中,我们首先创建一个JSON对象 ,然后向它添加键值对。接下来,我们使用 函数将JSON对象序列化为字符串,并使用 函数释放序列化后的字符串内存。最后,我们使用 函数释放JSON对象的内存。

请注意,这个示例仅用于演示内存管理的基本原则。在实际应用中,您可能会处理更复杂的JSON结构,嵌套对象和数组,因此需要更复杂的内存管理策略来确保没有内存泄漏或错误。

到此这篇cjson库函数(库函数stdio)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • max函数是窗口函数(max函数调用)2025-02-20 12:54:06
  • pem文件是什么意思(pem格式文件怎么打开)2025-02-20 12:54:06
  • 多级列表如何设置1-1(多级列表如何设置1.1、2.1.2.2这样的格式)2025-02-20 12:54:06
  • 信用卡支付方式有哪些(信用卡支付方式有哪些种类)2025-02-20 12:54:06
  • 支付方式怎么填写(医疗支付方式怎么填写)2025-02-20 12:54:06
  • 分层图层是什么(分层图格式)2025-02-20 12:54:06
  • 简单好玩的编程代码大全(简单的编程代码小游戏)2025-02-20 12:54:06
  • rs485报文格式(485报文分析软件)2025-02-20 12:54:06
  • rms公式excel(rmse计算公式excel)2025-02-20 12:54:06
  • 485报文解析公式(485报文怎么读)2025-02-20 12:54:06
  • 全屏图片