如何正确使用CJson库进行数据接收?

cJSON 是一个轻量级的 JSON 解析和生成库,用于 C 语言。它提供了简单的 API 来处理 JSON 数据,包括解析、生成和操作 JSON 对象和数组。

cJSON 接收例子

如何正确使用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 数据类型:

逻辑值:如truefalse

null

如何正确使用CJson库进行数据接收?

数字:整数或浮点数

字符串:用双引号括起来

数组:用中括号[] 包含多个值

对象:用大括号{} 包含多个键值对

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 文件

如何正确使用CJson库进行数据接收?

当 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<

(0)
运维的头像运维
上一篇2025-01-06 12:26
下一篇 2025-01-06 12:46

相关推荐

  • 安谋电子科技招聘什么岗位?

    安谋电子科技招聘信息发布,旨在吸引具备创新思维和专业能力的优秀人才加入,共同推动半导体与人工智能领域的技术突破与产业发展,作为全球领先的半导体知识产权提供商,安谋电子科技始终致力于通过先进的技术架构和解决方案,赋能全球合作伙伴,构建开放共赢的产业生态,本次招聘涵盖技术研发、产品设计、市场销售、运营支持等多个领域……

    2025-11-20
    0
  • 大疆硬件工程师招何才?技能门槛有多高?

    大疆创新作为全球领先的无航拍系统、手持影像系统及机器人领域的高科技企业,其硬件工程师岗位是推动技术创新与产品落地的核心力量,硬件工程师在大疆的工作不仅涉及传统硬件开发的全流程,更需结合消费电子、机器人、人工智能等多领域技术,解决复杂工程问题,打造高性能、高可靠性的智能硬件产品,岗位职责与核心要求大疆硬件工程师的……

    2025-11-17
    0
  • 德州仪器2018招聘具体要求有哪些?

    德州仪器作为全球领先的半导体设计制造公司,其2018年招聘活动备受关注,吸引了众多电子工程、计算机科学等相关专业人才的目光,此次招聘覆盖了技术研发、市场营销、运营管理等多个领域,旨在吸纳具备创新能力和实践精神的优秀人才,共同推动公司在半导体领域的持续发展,在技术研发岗位方面,德州仪器2018年重点招聘模拟电路设……

    2025-11-17
    0
  • 开发无人机地面站招聘,需什么技能经验?

    随着无人机技术的飞速发展,其在航拍测绘、物流运输、农业植保、应急救援等领域的应用日益广泛,作为无人机系统的“神经中枢”,地面站软件的开发与优化成为行业核心竞争点之一,当前,市场对无人机地面站开发人才的需求呈现爆发式增长,企业亟需具备扎实技术功底、熟悉行业应用场景的复合型工程师,以推动地面站系统的智能化、多功能化……

    2025-11-16
    0
  • 嵌入式全栈工程师需掌握哪些核心技能?

    构建智能硬件的核心力量在数字化与智能化浪潮席卷全球的今天,嵌入式系统已从传统的单一功能设备演变为连接物理世界与数字世界的核心载体,从智能家居、工业物联网到智能汽车、医疗设备,嵌入式全栈工程师作为“软硬件兼备”的复合型人才,正成为企业争夺的焦点,这类工程师不仅需要精通底层硬件设计与驱动开发,还需掌握上层应用开发……

    2025-11-16
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注