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.mfbz.cn/a/768824.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android studio 打包低版本的Android项目报错

一、报错内容 Execution failed for task :app:packageRelease. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade> com.android.ide.common.signing.KeytoolException: Failed to read key key0 from store "…

如何创建移动类型

第一步打开事务代码&#xff1a; OMJJ 下面这个工作区可以不填&#xff0c;或者填入你的范围&#xff08;例如我准备copy Z52成为Z54 那么就可以输入从Z52到Z54&#xff0c;SAP的这个操作就是这么怪&#xff0c;哈哈&#xff09;不然就会出现一个这样的报错“在工作区中指定关…

聚焦西安应博会|2024西安城市安全应急产业展9月精彩呈现

2024西安城市安全应急产业博览会 时间&#xff1a;2024年9月12日-14日 地点&#xff1a;西安国际会展中心 运营&#xff1a;西安西部文化产业博览会有限公司 【展会简介】 为推动安全应急装备向智能化、成套化、专业化方向发展&#xff0c;迎接新质生产力在应急产业新技术…

在C++中,工厂模式的思考(《C++20设计模式》及常规设计模式对比)

文章目录 一、前言二、讲解1、构造函数的弊端2、工厂方法&#xff08;解决上述弊端&#xff09;3、简单工厂3.1 **UML类图**3.2 **实现** 4、工厂模式4.1 **UML类图**4.2 **实现** 5、抽象工厂5.1 **UML类图**5.2 **实现** 三、总结 一、前言 在看《C20设计模式》一书中产生了…

【软件测试】快速定位bug,编写测试用例

作为一名测试人员如果连常见的系统问题都不知道如何分析&#xff0c;频繁将前端人员问题指派给后端人员&#xff0c;后端人员问题指派给前端人员&#xff0c;那么在团队里你在开发中的地位显而易见 &#xff0c;口碑、升值、加薪那应该是你遥不可及的梦 但是作为测试人员来说&…

【ARMv8/v9 GIC 系列 5 -- GIC GICD_CTRL 使用详细介绍】

文章目录 GICD_CTRLGICD_CTLR 寄存器结构RWP&#xff08;Register Write Pending&#xff09;E1NWF&#xff08;Enable 1 of N Wakeup Functionality&#xff09;DS&#xff08;Disable Security&#xff09; 亲和性路由&#xff08;Affinity Routing&#xff09;ARE_NSARE_S 中…

华侨大学24计算机考研数据速览,专硕22408复试线290分,学硕11408接收调剂!

华侨大学计算机专业创建于1980年&#xff0c;是福建省最早设立计算机专业的高校之一。1982年成立计算机系&#xff0c;2008年成立计算机科学与技术学院。根据“华侨大学计算机科学与技术学院网站”资料&#xff0c;该院有计算机科学与技术、软件工程、网络工程3个本科专业&…

Mysql-基础-DDL操作

1、数据库操作 查询 查询所有数据库 show databases; 创建 创建数据库 create database [if not exists] 数据库名 使用及查询 use 数据库名 select database() 查询当前所处数据库 删除 drop database [if not exists] 数据库名 2、表操作 查询当前库中的所…

使用Python绘制彩虹效果:动态彩虹动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义绘制彩虹函数定义颜色列表主循环 完整代码 引言 彩虹是自然界中最美丽的现象之一。通过编程&#xff0c;我们可以将这一奇妙的景象带到屏幕上。在这篇博客中&#xff0c;我们将使用Python来创建一个…

如何优化网站SEO排名?

选择那些容易排名的关键词。使用工具找到那些竞争少但有流量的词语。其次&#xff0c;内部链接非常重要。通过合理的内部链接&#xff0c;可以提升各个页面的权重。 增加FAQ部分能帮助你捕捉更多的长尾关键词流量。争取出现在精选摘要的位置&#xff0c;可以直接提升你的曝光率…

django 逆向生成对应数据库表的models模型类 —— python

一&#xff0c;在setting.py中配置好连接数据库的参数 在setting中的DATABASESZ中配置默认参数&#xff0c;并在INSTALLED_APPS中导入模块名。 DATABASES {default:{ENGINE: django.db.backends.mysql, # 数据库引擎NAME: jljupcs, # 数据库名称HOST: 127.0.0.1, # 数据库…

【设计模式】策略模式(定义 | 特点 | Demo入门讲解)

文章目录 定义策略模式的结构 QuickStart | DemoStep1 | 策略接口Step2 | 策略实现Step3 | 上下文服务类Step4 | 客户端 策略模式的特点优点缺点 定义 策略模式Strategy是一种行为模式&#xff0c;它能定义一系列算法&#xff0c;并将每种算法分别放入到独立的类中&#xff0c…

解决pip安装时的“SyntaxError: invalid syntax”错误

项目场景&#xff1a; 项目中有新的成员加入时&#xff0c;第一步就是安装开发环境&#xff0c;然而往往同样的机器、同样的配置&#xff0c;我们却总能遇到各种各样不同的问题。 今天分享一个简单的操作问题。 问题描述 项目用到pandas&#xff0c;安装pandas时遇到Syntax…

代码随想录-Day46

121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从…

CAN学习笔记

学习链接&#xff1a;CAN学习笔记&#xff08;1&#xff09;_can sjw-CSDN博客 内容全部取自链接&#xff0c;非原创。用于自己学习和记录&#xff0c;如有错误请指正。如果侵权了&#xff0c;请联系我删掉。 CAN主要有两种物理层&#xff0c;1.闭环的ISO11898 2.开环的ISO1…

MSI安装包安装的Mysql8,配置文件my.ini在哪儿?

版本 我安装的版本是8.0.36&#xff0c;server根目录下没有配置文件。 文件位置 首先找到对应的windows服务 右击属性&#xff0c;可以看到启动参数&#xff0c;启动参数中有配置文件的路径 比如我的配置文件在"C:\ProgramData\MySQL\MySQL Server 8.0\my.ini"

XHS xs逆向分析

已经把所有的侵权地方删除&#xff0c;望批准 前言 1.本文单纯学习jsvmp和交流&#xff0c;无任何其他意图 2.学习jsvmp&#xff0c;通过插桩和算法还原。 问&#xff1a;什么是vmp&#xff1f; JSVMP&#xff08;JavaScript Virtual Machine Protocol&#xff09;是一种…

严蔚敏数据结构(C语言版)吴伟民宁编著清华大学计算机系列教材+题集+配套题库+笔记+习题PDF电子版

今天分享的是 严蔚敏数据结构&#xff08;C语言版&#xff09;题集配套题库笔记习题PDF电子版 注&#xff1a;本资源搜集于网络&#xff0c;仅供学习交流&#xff0c;严禁用于商业用途 内容简介&#xff1a; “数据结构”是计算机程序设计的重要理论技术基础&#xff0c;它…

002 使用kibana操作ElasticSearch7.x

文章目录 4.使用kibana操作es4.1.文档操作1.put方式发送数据2.post方式发送数据3.查看索引文档 GET4.更新文档 POST5.删除文档&索引 DELETE6.批量添加数据_bulk 4.2.Query DLS(查询领域对象语言)1.url 检索数据语法2.查询所有数据3.查询全部数据并排序4.查询全部数据排序并…

蓝蜂网关接入雄安新区物联网统一开放平台应用案例

蓝蜂网关接入雄安新区物联网统一开放平台案例 一、应用背景 为响应国家《河北雄安新区规划纲要》&#xff0c;由中国雄安集团数字城市科技有限公司牵头&#xff0c;以中移物联网有限公司为牵头单位的联合体&#xff0c;构建了雄安新区物联网统一开放平台&#xff08;简称雄安…