CJSON库

news2024/11/23 19:31:05

目录

一、介绍

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.coloradmin.cn/o/1877843.html

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

相关文章

【Python3的内置函数和使用方法】

目录 Python 特点 Python 中文编码 Python 变量类型 Python列表 Python 元组 元组是另一个数据类型&#xff0c;类似于 List&#xff08;列表&#xff09; Python 字典 Python数据类型转换 Python 运算符 Python算术运算符 Python比较运算符 Python赋值运算符 Pyt…

clion ctrl+左键只能跳转到虚函数的声明处

右击函数 -> GOTO -> Definition 这样不够便捷&#xff0c;但是我没有找到更好的办法 可能是因为该函数是虚函数的重写&#xff0c;clion 无法识别出该函数是虚函数的哪个重写版&#xff0c;只能跳转到唯一的虚函数位置

FlowUs息流打造AI赋能下的知识库,信息深度挖掘与智能创作!FlowUs让你的数据资产更有价值

在AI时代的大潮中&#xff0c;FlowUs息流笔记类数据库凭借其强大的数据资产管理能力&#xff0c;正以前所未有的方式重塑着知识工作者的学习、研究与协作模式。当深厚的数据资产遇上AI的智能助力&#xff0c;无论是学术论文的撰写&#xff0c;还是高效提炼多人会议的核心观点&a…

Summaries

摘要是网格项&#xff0c;它利用聚合函数来显示有关所显示数据的摘要信息&#xff1a;总记录计数、最小值等。 GridControl-Grid View Summary Types 汇总 汇总总数&#xff08;GridSummaryItem&#xff09;是根据所有数据网格记录计算的&#xff0c;并显示在视图页脚中。启…

一文讲透大模型 Qwen2 的训练与推理

通义千问最近问鼎开源模型Top 1 &#xff0c;今天我来分享一下Qwen2系列模型&#xff0c;Qwen2系列模型是Qwen1.5系列模型的重大升级。包括了&#xff1a; 5个尺⼨的预训练和指令微调模型, 包括Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B以及Qwen2-72B&#xff1b; 在…

如何解决java程序CPU负载过高问题

1、介绍 在生产环境中&#xff0c;有时会遇到cpu占用过高且一直下不去的场景。这种情况可能会导致服务器宕机&#xff0c;进而中断对外服务&#xff0c;也会影响硬件寿命。 2、原因 1、Java代码存在因递归不当等原因导致的死循环的问题&#xff0c;推荐有条件的循环&#xf…

一个项目学习IOS开发---创建一个IOS开发项目

前提&#xff1a; 由于IOS开发只能在MacOS上开发&#xff0c;所以黑苹果或者购买一台MacBook Pro是每个IOS开发者必备的技能或者工具之一 Swift开发工具一般使用MacOS提供的Xcode开发工具 首先Mac Store下载Xcode工具 安装之后打开会提醒你安装IOS的SDK&#xff0c;安装好之…

统计信号处理基础 习题解答11-12

题目 证明 的MAP估计量为 其中是一个的矢量, 是一个可逆的p*p的矩阵。也就是说&#xff0c;MAP估计量对可逆的线性变换是可以变换的。 解答 已知的联合概率密度 且&#xff1a; 现在知道&#xff1a; 那么为了获得变换后的MAP&#xff0c;首先需要根据求出 根据概率密度变换…

【图解大数据技术】Hadoop、HDFS、MapReduce、Yarn

【图解大数据技术】Hadoop、HDFS、MapReduce、Yarn HadoopHDFSHDFS架构写文件流程读文件流程 MapReduceMapReduce简介MapReduce整体流程 Yarn Hadoop Hadoop是Apache开源的分布式大数据存储与计算框架&#xff0c;由HDFS、MapReduce、Yarn三部分组成。广义上的Hadoop其实是指H…

Linux中彩色打印

看之前关注下公众号呗 第1部分&#xff1a;引言 1.1 Python在文本处理中的重要性 Python作为一种广泛使用的高级编程语言&#xff0c;以其简洁的语法和强大的功能在文本处理领域占有一席之地。无论是数据清洗、自动化脚本编写&#xff0c;还是复杂的文本分析&#xff0c;Py…

不可编辑的加密word文件破解

文章目录 1 将word文件另存为xml格式2 使用记事本打开xml格式的word文件3 ctrlF查找w:enforcement4 将w:enforcement"1"改成w:enforcement"0"并保存5 用word打开xml格式的文件并另存为docx格式6 成功可以编辑 1 将word文件另存为xml格式 2 使用记事本打开x…

汽车电子行业知识:什么是电子后视镜

文章目录 1.什么是电子后视镜2.有哪些汽车用到了电子后视镜3.电子后视镜的原理及算法4.电子后视镜的优点5.电子后视镜的未来市场将继续增长 1.什么是电子后视镜 电子后视镜是一种集成了电子元件和显示屏的汽车后视镜&#xff0c;用于替代传统的机械后视镜。它通过内置的摄像头捕…

Open vSwitch 行为匹配的实现

一、Datapath 模块的行为匹配 在 Open vSwitch 的数据包转发流程中&#xff0c;存在快速路径和慢速路径两种模式&#xff0c;如下图所示&#xff1a; 其中&#xff0c;快速路径直接在 Datapath 模块完成行为匹配&#xff0c;将数据包转发出去。而慢速路径的数据包无法在 Datapa…

AI大模型到底有没有智能?一篇文章给你讲明明白白

生成式人工智能 (GenAI[1] ) 和大语言模型 (LLM [2] )&#xff0c;这两个词汇想必已在大家的耳边萦绕多时。它们如惊涛骇浪般席卷了整个科技界&#xff0c;登上了各大新闻头条。ChatGPT&#xff0c;这个神奇的对话助手&#xff0c;也许已成为你形影不离的良师益友。 然而&…

一次可输入多张图像,还能多轮对话!最新开源数据集,让AI聊天更接近现实

大模型对话能更接近现实了&#xff01; 不仅可以最多输入20张图像&#xff0c;还能支持多达27轮对话。可处理文本图像tokens最多18k。 这就是最新开源的超长多图多轮对话理解数据集MMDU&#xff08;Multi-Turn Multi-Image Dialog Understanding&#xff09;。 大型视觉语言模…

技术周总结2024.06.17~06.23(Doris数据库)

文章目录 一、06.18 周二1.1&#xff09; 问题01&#xff1a; doris数据表写入使用 stream load好还是 inser into好 一、06.18 周二 1.1&#xff09; 问题01&#xff1a; doris数据表写入使用 stream load好还是 inser into好 对于Doris数据表的写入操作&#xff0c;通常推荐…

【折腾笔记】兰空图床使用Redis做缓存

前言 最近发现我部署在群晖NAS上的兰空图床程序在高并发的情况下会导致图片加载缓慢或出现图片加载失败的情况&#xff0c;于是我查阅了官方文档资料并进行了一系列的测试&#xff0c;发现兰空图床如果开启了原图保护功能&#xff0c;会非常的吃CPU的性能&#xff0c;尤其是在…

编译工具-Gradle

文章目录 Idea中配置Gradle项目project目录settings.gradlebuild.gradlegradlewgradlew.bat Gradle Build生命周期编写Settings.gradle编写Build.gradleTasksPlugins Idea中配置 配置项&#xff1a;gradle位置 及仓库位置 Gradle项目 Task&#xff0c;settings.gradle,build.…

【Arduino】实验使用ESP32控制可编程继电器制作跑马灯(图文)

今天小飞鱼实验使用ESP控制继电器&#xff0c;为了更好的掌握继电器的使用方法这里实验做了一个跑马灯的效果。 这里用到的可编程继电器&#xff0c;起始原理并不复杂&#xff0c;同样需要ESP32控制针脚输出高电平或低电平给到继电器&#xff0c;继电器使用这个信号控制一个电…

【SpringBoot】SpringBoot核心启动流程源码解析

SpringBoot总体流程 当我们启动一个SpringBoot程序的时候&#xff0c;只需要一个main方法就可以启动&#xff0c;但是对于其中流程时如何执行的&#xff0c;以及如何调用spring的IOC和AOP机制&#xff0c;本篇带着这个问题来整体体系化的梳理下流程。 SpringBootApplication …