CJSON库

目录

一、介绍

1、JSON是什么

2、为什么使用CJSON

3、JSON格式

二、使用CJSON构造JSON

1、创建对象

2、添加字段

3、转换格式

4、释放对象

 三、使用CJSON解析JSON

1、解析数据

2、 获取字段

3、释放对象


一、介绍

1、JSON是什么

        JSON是什么呢?JSON全称JavaScript Object Notation,是一种轻量级的数据交换格式,主要用于存储和交换文本信息。换句话说就是我们用JSON就是为了解析收到的数据和发送对方能够解析的数据。

        简洁和清晰的层次结构使得JSON成为理想的数据交换语言,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输速率。

2、为什么使用CJSON

       CJSON是一个轻量级、高效、易用的JSON解析库,适用于C语言。 在做项目开发时,为什么大家都喜欢选择CJSON来解析JSON字符串呢?CJSON工程文件很简单,仅一个.c文件和一个.h文件,文件体积很小。除此之外,cJSON 库通过简单的 API 提供了高效的 JSON 处理功能。它允许用户解析 JSON 字符串、创建和修改 JSON 对象、提取字段值,以及将 JSON 对象序列化为字符串。所以cJSON 库非常适合在资源受限的嵌入式系统中使用。

3、JSON格式

        对象在花括号 {} 中表示,一组键值对组成。键是字符串,值可以是字符串、数字、布尔值、数组、对象或 null。大家可以对照这个示例:

{"name": "xiao xin","age": 21,"is_student": true,"email": "xxxxxxxxxx@qq.com","skills": [ "Python", "C"],"address": {"street": "123 Main St","city": "Anytown","state": "CA","postal_code": "12345"}
}

二、使用CJSON构造JSON

        在 C 语言中使用 cJSON 库来构造 JSON 数据非常简单。接下来我为大家整理了构造JSON常用的几个函数。

1、创建对象

       我们需要先创建一个空的 cJSON 对象,表示一个 JSON 对象 {}

cJSON *cJSON_CreateObject(void);

2、添加字段

        当创建完对象后,我们需要调用函数往该对象中添加相对应的字段。以下是我整理的常用函数。

(1)添加布尔值

void cJSON_AddBoolToObject(cJSON *object, const char *name, cJSON_bool value);

(2)添加空值

void cJSON_AddNullToObject(cJSON *object, const char *name);

(3)添加JSON数组字段

void cJSON_AddItemToObject(cJSON *object, const char *name, cJSON *item);

(4)添加JSON对象字段

void cJSON_AddItemToObject(cJSON *object, const char *name, cJSON *item);

3、转换格式

        最后,我们需要将 cJSON 对象转换为 JSON 格式的字符串。

char *cJSON_Print(const cJSON *item);

        该函数会将 cJSON 对象转换为 JSON 格式的字符串并返回这个字符串的指针。这个函数非常有用,可以帮助将 cJSON 对象构建的 JSON 数据序列化为可读的文本格式,便于输出、存储或传输。 

4、释放对象

        在使用 cJSON 解析 JSON 数据或构造 JSON 对象之后,我们需要释放内存,以防止内存泄漏。

void cJSON_Delete(cJSON *c);

      c:指向要删除的 cJSON 对象的指针。

        给大家一个参考代码,大家可以自己动手试试看(编译时注意链接CJSON动态库):

#include <stdio.h>
#include <stdlib.h>
#include <cJSON.h>int main()
{// 创建一个 cJSON 对象,表示一个 JSON 对象 {}cJSON *root = cJSON_CreateObject();// 添加字符串字段cJSON_AddStringToObject(root, "name", "xiao xin");// 添加整数字段cJSON_AddNumberToObject(root, "age", 21);// 创建一个包含技能的 JSON 数组 "skills"cJSON *skillsArray = cJSON_CreateArray();cJSON_AddItemToArray(skillsArray, cJSON_CreateString("Python"));cJSON_AddItemToArray(skillsArray, cJSON_CreateString("C"));cJSON_AddItemToObject(root, "skills", skillsArray);// 添加布尔值字段cJSON_AddBoolToObject(root, "is_student", cJSON_True);// 添加空值字段cJSON_AddNullToObject(root, "notes");// 添加联系信息 JSON 对象字段cJSON *contactObject = cJSON_CreateObject();cJSON_AddStringToObject(contactObject, "email", "xxxxxxxxxx@qq.com");cJSON_AddStringToObject(contactObject, "phone", "555-555-5555");cJSON_AddItemToObject(root, "contact", contactObject);// 将 cJSON 对象转换为 JSON 格式的字符串char *json_string = cJSON_Print(root);printf("%s\n", json_string);    // 打印生成的 JSON 字符串cJSON_Delete(root);            // 释放 cJSON 对象占用的内存free(json_string);            // 释放 cJSON_Print 分配的内存return 0;
}

运行结果:

 三、使用CJSON解析JSON

         在 C 语言中使用 cJSON 库来解析 JSON 数据非常简单。接下来我为大家整理了构造JSON常用的几个函数。

1、解析数据

        我们需要先将JSON格式的字符串解析成CJSON对象。

cJSON *cJSON_Parse(const char *value);

        该函数是解析 JSON 数据的关键函数,将一个JSON数据包,按照cJSON结构体的结构序列化整个数据包,并在堆中开辟一块内存存储cJSON结构体,成功后返回一个指向解析后的 cJSON 对象的指针。

2、 获取字段

        接下来我们从一个 cJSON 对象中获取指定键的值。

cJSON *cJSON_GetObjectItem(cJSON *object, const char *string);

        该函数用于获取JSON字符串字段值,成功返回一个指向cJSON类型的结构体指针。

3、释放对象

        和2、4是一样的,这里就不再重复赘述了。

       

         给大家一个参考代码,大家可以自己动手试试看(编译时注意链接CJSON动态库):

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"int main() {// JSON 字符串const char *json_string = "{""\"name\":\"xiao xin\",""\"age\":21,""\"is_student\":true,""\"email\":\"xxxxx@qq.com\",""\"skills\":[\"Python\",\"C\"],""\"address\":{""\"street\":\"123 Main St\",""\"city\":\"Anytown\",""\"state\":\"CA\",""\"postal_code\":\"12345\"""}""}";// 解析 JSON 字符串cJSON *root = cJSON_Parse(json_string);if (root == NULL) {const char *error_ptr = cJSON_GetErrorPtr();if (error_ptr != NULL) {fprintf(stderr, "Error before: %s\n", error_ptr);}return 1;}// 提取字段cJSON *name = cJSON_GetObjectItem(root, "name");cJSON *age = cJSON_GetObjectItem(root, "age");cJSON *is_student = cJSON_GetObjectItem(root, "is_student");cJSON *email = cJSON_GetObjectItem(root, "email");cJSON *skills = cJSON_GetObjectItem(root, "skills");cJSON *address = cJSON_GetObjectItem(root, "address");// 打印字段if (cJSON_IsString(name) && (name->valuestring != NULL)) {printf("Name: %s\n", name->valuestring);}if (cJSON_IsNumber(age)) {printf("Age: %d\n", age->valueint);}if (cJSON_IsBool(is_student)) {printf("Is student: %s\n", cJSON_IsTrue(is_student) ? "true" : "false");}if (cJSON_IsString(email) && (email->valuestring != NULL)) {printf("Email: %s\n", email->valuestring);}if (cJSON_IsArray(skills)) {printf("Skills:\n");cJSON *skill = NULL;cJSON_ArrayForEach(skill, skills) {if (cJSON_IsString(skill)) {printf("  - %s\n", skill->valuestring);}}}if (cJSON_IsObject(address)) {cJSON *street = cJSON_GetObjectItem(address, "street");cJSON *city = cJSON_GetObjectItem(address, "city");cJSON *state = cJSON_GetObjectItem(address, "state");cJSON *postal_code = cJSON_GetObjectItem(address, "postal_code");if (cJSON_IsString(street) && (street->valuestring != NULL)) {printf("Street: %s\n", street->valuestring);}if (cJSON_IsString(city) && (city->valuestring != NULL)) {printf("City: %s\n", city->valuestring);}if (cJSON_IsString(state) && (state->valuestring != NULL)) {printf("State: %s\n", state->valuestring);}if (cJSON_IsString(postal_code) && (postal_code->valuestring != NULL)) {printf("Postal Code: %s\n", postal_code->valuestring);}}// 释放 cJSON 对象占用的内存cJSON_Delete(root);return 0;
}

运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/36948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

折半查找详解

一&#xff1a;折半查找概念 折半查找&#xff08;也称为二分查找&#xff09;是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始&#xff0c;如果中间元素正好是目标值&#xff0c;则搜索过程结束&#xff1b;如果目标值大于或小于中间元素&#x…

OceanBase 4.2.1 离线安装

OceanBase 4.2.1 离线安装 4.2 版本的OceanBase支持一键安装&#xff0c;所以在线版本的安装简单了很多&#xff0c;但在无法连接网络的情况下安装就只能手动离线安装。 注&#xff1a;如下安装过程都是在同一台机器上面进行&#xff0c;也就是只有一个节点&#xff0c;多个节…

SSM网上旅游信息管理系统-计算机毕业设计源码06975

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3论文结构与章节安排 2 系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设…

Oracle、MySQL、PostGreSQL、SQL Server-查询每秒事务数

Oracle、MySQL、PostGreSQL、SQL Server-查询每秒事务数 在做 db benchmarks 时&#xff0c;qps、tps 是衡量数据库性能的关键指标,TPS : Transactions Per Second 是每秒事务数&#xff0c;即数据库服务器在单位时间内处理的事务数。 横向对比计划几类数据库计算tps的方法。 …

微信小程序毕业设计-垃圾分类系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

AI产品哲学深探:从Perplexity CEO视角看搜索引擎的智慧启示

一、开篇:历史的分岔路口 在科技史的长河中,有些对话悄然决定了行业的走向。回溯至互联网搜索的黎明时期,一场未被充分重视的会谈在两位科技巨擘之间展开。谷歌联合创始人Larry Page与昔日搜索引擎巨头Excite的CEO坐在了谈判桌两端,他们的对话不仅关乎一次潜在的并购,更预…

elasticsearch的查询原理

数据结构 在 Elasticsearch 中,数据结构分布如下: 索引(Index) 索引是 Elasticsearch 中存储数据的基本单元,相当于关系型数据库中的数据库。一个 Elasticsearch 集群中可以包含多个索引。 类型(Type) (从 Elasticsearch 7.0 开始已经被弃用): 在较早版本的 Elasticsearch…

Mathematica训练课(46)-- 一些常用的画图函数

在前面的课程中&#xff0c;我们已经梳理了Plot的画图用法&#xff0c;今天就详细梳理一下其他的画图函数用法&#xff1b; 1. 画一条直线 2. Circle(圆) 3. Disk&#xff08;圆盘&#xff09; 4. 画出一个矩形 5. 箭头

c-前缀平方和序列(牛客小白月赛97)

题目&#xff1a; 假如一个长度为 n的正整数序列满足所有前缀和 都是平方数&#xff0c;那么称这种序列为前缀平方序列。 条件1<si<x 取模1e97 首先找出小于x的平方数有几个。 然后用二项式定理 算出小于x的平方数中取n个的种数。 #include<bits/stdc.h> using…

大数据可视化实验(六)——ECharts与pyecharts数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1、ECharts可视化制作.. 1 1&#xff09;使用ECharts绘制折线图显示一周的天气变换。... 1 2&#xff09;使用ECharts绘制柱状图显示商品销量的变化。... 4 2、pyecharts可视化制作.. 7 1&#xff09;使用…

beautifulSoup库

是什么? Beautiful Soup(简称BS4)是一种强大而灵活的HTML和XML解析库,广泛用于Python爬虫和数据采集中。相比正则表达式更加简洁. Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的…

【知识学习】Unity3D中Shader Graph的概念及使用方法示例

Unity3D中的Shader Graph是一个强大的可视化Shader编辑工具&#xff0c;它允许用户通过拖拽和连接节点的方式来创建Shader&#xff0c;而不是通过传统的编写代码的方式。Shader Graph使得Shader的创建过程更加直观和易于理解&#xff0c;特别是对于那些不熟悉Shader语言编程的美…

Java中的性能调优技巧与工具推荐

Java中的性能调优技巧与工具推荐 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨Java中的性能调优技巧与工具推荐。Java作为一门广泛应用的编程语…

【OpenREALM学习笔记:13】pose_estimation.cpp和pose_estimation.h

UML Class Diagram 图中红色框为头文件中所涉及到的函数、变量和结构体 核心函数 PoseEstimation::process() 其核心作用为执行位姿估计的处理流程&#xff0c;并返回是否在此循环中进行了任何处理。 在这个函数中判断并完成地理坐标的初始化或这地理坐标的更新。 这里需要…

QTreeView第一列自适应

通过setStretchLastSection(bool stretch)可以设置最后一列自适应,对于QTreeView,stretch默认为true。但有时候我们需要设置第一列自适应,比如文件浏览器,共有名称、大小和修改日期三列,大小和日期的宽度几乎是固定的,但名称却可长可短,此时我们希望在窗口大小变化时,第…

IDEA中Maven配置依赖和排除依赖

目录 依赖配置 添加依赖的几种方式&#xff1a; 1.利用中央仓库搜索的依赖坐标 2.利用IDEA工具搜索依赖 3.熟练上手maven后&#xff0c;快速导入依赖 排除依赖 依赖配置 依赖&#xff1a;指当前项目运行所需要的jar包。一个项目中可以引入多个依赖&#xff1a; 例如&am…

python r”, b”, u”, f” 前缀详解

1、r前缀 一般来说&#xff0c;\n’是一个换行符&#xff0c;是一个字符串&#xff1b;而加上r为前缀后&#xff0c;不会以任何特殊方式处理反斜杠。因此&#xff0c;r"\n" 是包含 ‘\’ 和 ‘n’ 的双字符字符串&#xff1b;示例如下&#xff1a; >>> pr…

Go-知识测试-工作机制

Go-知识测试-工作机制 生成test的maintest的main如何启动case单元测试 runTeststRunnertesting.T.Run 示例测试 runExamplesrunExampleprocessRunResult 性能测试 runBenchmarksrunNtesting.B.Run 在 Go 语言的源码中&#xff0c;go test 命令的实现主要在 src/cmd/go/internal…

Java面试题:解释反应式编程的概念,并讨论如何在Java中使用RxJava或Project Reactor实现

反应式编程&#xff08;Reactive Programming&#xff09;是一种基于异步数据流和变化传播的编程范式。它强调通过声明式编程来处理异步事件流和数据流&#xff0c;简化了复杂的异步操作和并发编程。反应式编程适用于处理异步事件、多线程处理、大量数据流、用户交互等场景。 …

零基础快速上手HarmonyOS ArkTS开发4---从简单的页面开始

接着上一次零基础快速上手HarmonyOS ArkTS开发3---应用程序框架的继续往下。 常用基础组件&#xff1a; 概述&#xff1a; 关于组件的一些基础概念就里就不多说了&#xff0c;官方有很详细的说明&#xff0c;而在HarmonyOS按功能分有如下几大类组件&#xff1a;基础组件、容…