cJSON 接收例子
cJSON 是一个轻量级的 JSON 解析库,使用 C 语言实现,它非常适用于嵌入式系统和需要高效处理 JSON 数据的场景,本文将详细介绍如何使用 cJSON 进行 JSON 数据的接收和解析,并提供相关示例代码。
cJSON 基本概念
在开始之前,我们需要了解一些关于 cJSON 的基本概念:
1、cJSON 类型:cJSON 支持多种数据类型,包括逻辑值、null、数字、字符串、数组和对象。
2、cJSON 结构体:cJSON 使用结构体来表示 JSON 数据,每个节点由cJSON
结构体组成,包含类型、值以及指向子节点的指针。
3、cJSON 函数:常用的 cJSON 函数包括cJSON_Parse
(解析 JSON 字符串)、cJSON_GetObjectItem
(获取对象项)、cJSON_Delete
(删除 cJSON 对象)等。
JSON 数据格式
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,以键值对的形式存在,以下是一些常见的 JSON 数据类型:
逻辑值:如true
或false
null
数字:整数或浮点数
字符串:用双引号括起来
数组:用中括号[]
包含多个值
对象:用大括号{}
包含多个键值对
cJSON 接收和解析示例
示例 1:解析简单的 JSON 字符串
下面是一个简单的示例,演示如何使用 cJSON 解析一个简单的 JSON 字符串。
#include <stdio.h> #include <stdlib.h> #include "cJSON.h" int main() { char jsonData[] = "{\"name\":\"C Primer pluse\",\"pages\":626}"; // 解析 JSON 字符串 cJSON *srcJsonData = cJSON_Parse(jsonData); if (!srcJsonData) { printf("Error before: [%s] ", cJSON_GetErrorPtr()); return -1; } // 获取并打印 JSON 数据的内容 cJSON *value; value = cJSON_GetObjectItem(srcJsonData, "name"); if (value->type == cJSON_String) { printf("书名:%s ", value->valuestring); } value = cJSON_GetObjectItem(srcJsonData, "pages"); if (value->type == cJSON_Number) { printf("页数:%d ", value->valueint); } // 释放 JSON 对象的内存 cJSON_Delete(srcJsonData); return 0; }
运行结果:
书名:C Primer pluse 页数:626
示例 2:解析复杂的 JSON 文件
当 JSON 数据较大时,通常使用文件保存 JSON 数据,下面是一个示例,演示如何从文件中读取并解析 JSON 数据。
假设有一个名为data.txt
的文件,内容如下:
{ "class": "C语言书籍", "books": [ { "name": "C Primer pluse", "author": "Stephen Prata", "publishing": "人民邮电出版社" }, { "name": "C程序设计", "author": "谭浩强", "publishing": "清华大学出版社" }, { "name": "C陷阱与缺陷", "author": "Andrew Koenig", "publishing": "人民邮电出版社" } ] }
解析该文件的代码如下:
#include <stdio.h> #include <stdlib.h> #include "cJSON.h" int main() { FILE *fp = fopen("data.txt", "r"); if (fp == NULL) { perror("Failed to open file"); return -1; } // 获取文件大小 fseek(fp, 0, SEEK_END); long length = ftell(fp); fseek(fp, 0, SEEK_SET); // 分配内存并读取文件内容 char *data = (char *)malloc(length + 1); fread(data, 1, length, fp); data[length] = '\0'; fclose(fp); // 解析 JSON 数据 cJSON *root = cJSON_Parse(data); if (!root) { printf("Error before: [%s] ", cJSON_GetErrorPtr()); free(data); return -1; } // 获取并打印 class 的值 cJSON *value = cJSON_GetObjectItem(root, "class"); if (value->type == cJSON_String) { printf("类别:%s ", value->valuestring); } // 获取并打印 books 数组中的每一项 cJSON *books = cJSON_GetObjectItem(root, "books"); if (books && books->type == cJSON_Array) { int numBooks = cJSON_GetArraySize(books); for (int i = 0; i < numBooks; i++) { cJSON *book = cJSON_GetArrayItem(books, i); cJSON *name = cJSON_GetObjectItem(book, "name"); cJSON *author = cJSON_GetObjectItem(book, "author"); cJSON *publishing = cJSON_GetObjectItem(book, "publishing"); if (name && author && publishing) { printf("书名:%s, 作者:%s, 出版社:%s ", name->valuestring, author->valuestring, publishing->valuestring); } } } // 释放 JSON 对象的内存 cJSON_Delete(root); free(data); return 0; }
运行结果:
类别:C语言书籍 书名:C Primer pluse, 作者:Stephen Prata, 出版社:人民邮电出版社 书名:C程序设计, 作者:谭浩强, 出版社:清华大学出版社 书名:C陷阱与缺陷, 作者:Andrew Koenig, 出版社:人民邮电出版社
通过上述两个示例,我们展示了如何使用 cJSON 解析简单的 JSON 字符串和复杂的 JSON 文件,cJSON 提供了简洁易用的 API,使得在 C 语言中处理 JSON 数据变得非常方便,无论是简单的键值对还是复杂的嵌套结构,cJSON 都能轻松应对。
各位小伙伴们,我刚刚为大家分享了有关“cjson 接收例子”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/47686.html<