CJSON库

目录

一、介绍

1、JSON是什么

2、为什么使用CJSON

3、JSON格式

二、使用CJSON构造JSON

1、创建对象

2、添加字段

3、转换格式

4、释放对象

三、使用CJSON解析JSON

1、解析数据

[2、 获取字段](#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;
}

运行结果:

相关推荐
No0d1es1 小时前
电子学会青少年软件编程(C语言)等级考试试卷(四级)2025年12月
c语言·青少年编程·电子学会·四级·2025年
皮皮哎哟1 小时前
深入浅出双向链表与Linux内核链表 附数组链表核心区别解析
c语言·数据结构·内核链表·双向链表·循环链表·数组和链表的区别
wanghu20242 小时前
AT_abc443_C~E题题解
c语言·算法
梵刹古音2 小时前
【C语言】 浮点型(实型)变量
c语言·开发语言·嵌入式
-dzk-2 小时前
【代码随想录】LC 203.移除链表元素
c语言·数据结构·c++·算法·链表
进击的小头3 小时前
陷波器实现(针对性滤除特定频率噪声)
c语言·python·算法
寄存器漫游者4 小时前
数据结构 C语言 顺序栈
java·c语言·数据结构
日拱一卒——功不唐捐4 小时前
循环队列+双端队列(C语言)
c语言·数据结构
进击的小头4 小时前
设计模式组合应用:嵌入式通信协议栈
c语言·设计模式·策略模式
养军博客4 小时前
C语言五天速成(可用于蓝桥杯备考 难度中等偏下)
c语言·算法·蓝桥杯