首页 > 其他分享 >cJSON学习及简单应用小结

cJSON学习及简单应用小结

时间:2024-06-11 20:11:07浏览次数:23  
标签:const temperature cJSON C语言 学习 item JSON 小结

JSON 简介

JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。它基于ECMAScript(欧洲计算机制造商协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。

以下是JSON的一些基本特点和用法:

  1. 数据格式:JSON可以表示两种类型的数据结构:
    • 对象:一个无序的“‘名称/值’对”集合。一个对象以花括号“{}”括起来,每个“名称”后跟一个冒号“:”,“‘名称/值’ 对”之间使用逗号“,”分隔。
    • 数组:是值(value)的有序集合。一个数组以方括号“[]”包括起来,值的列表用逗号“,”分隔。
  2. 易于阅读和编写:JSON的格式是基于文本的,因此它很容易阅读和编写。同时,它也很易于机器解析和生成。
  3. 易于解析:JSON使用JavaScript的一个子集,这意味着在JavaScript环境中,你可以直接解析JSON数据,无需任何额外的解析库。
  4. 轻量级:JSON的语法非常简单,数据描述也很紧凑,因此它是轻量级的,适合在网络中传输。
  5. 语言无关:虽然JSON基于JavaScript的一个子集,但它可以被任何编程语言读取和写入。这使得JSON成为一种理想的数据交换语言,可以用于服务器与浏览器之间,或者不同系统之间的数据交换。

cJSON(C语言JSON)库介绍

cJSON(C语言JSON)库是一个用于在C语言中解析和生成JSON数据的轻量级开源库,主要包括两个主要的源文件:cJSON.h(头文件)和cJSON.c(实现文件),使得在项目中集成和使用非常便捷。

  1. 主要特点

    • 轻量级:cJSON的实现非常简洁,但功能齐全,适合在嵌入式系统或资源受限的环境中使用。
    • 易于使用:通过简单的API调用,可以轻松地将JSON数据解析为C语言的数据结构(如数组、对象等),或将C语言的数据结构转换为JSON格式的字符串。
    • 跨平台性:由于cJSON是纯C语言实现的,因此它具有良好的跨平台性,可以在多种操作系统和编译器上运行。
  2. 数据结构

    cJSON库的核心部分体现在他的数据结构上,是cJSON结构体,利用该结构体用于表示JSON对象、数组、键值对等元素。

    typedef struct cJSON
    {
        /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem 用于在相同层级的对象或元素之间形成双向链表。*/
        struct cJSON *next;
        struct cJSON *prev;
        /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. 指向下一层级的子节点(如对象中的属性或数组中的元素)*/
        struct cJSON *child;
    
        /* The type of the item, as above.表示该元素的数据类型(如对象、数组、字符串、整数等)*/
        int type;
    
        /* The item's string, if type==cJSON_String  and type == cJSON_Raw 用于存储该元素的具体值(根据`type`的不同而选择不同的成员来存储)*/
        char *valuestring;
        /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
        int valueint;
        /* The item's number, if type==cJSON_Number */
        double valuedouble;
    
        /* The item's name string, if this item is the child of, or is in the list of subitems of an object. 用于表示该键值对的名称*/
        char *string;
    } cJSON;
    
  3. 主要功能

    • 解析JSON数据:cJSON库可以将JSON格式的字符串解析为C语言的数据结构,方便后续的处理和操作。
    • 生成JSON数据:通过cJSON库,可以将C语言的数据结构转换为JSON格式的字符串,以便于传输、存储或与其他系统进行数据交互。

cJSON安装

cJSON项目托管在Github上,仓库地址,因此可以用git命令直接克隆到本地,命令如下

git clone https://github.com/DaveGamble/cJSON.git

直接到cJSON托管的github官网进行下载,然后拷贝到自己的项目文件夹下面,官网如下:

https://github.com/DaveGamble/cJSON

官网的README还推荐了别的安装方法,CMAKE,Vcpkg等。

解析JSON数据常用API及简单举例

CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
//提供一段JSON格式内容,这将返回一个您可以查询的cJSON对象。
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
//从Object中获取项目“string”。不区分大小写。
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
//从Object中获取项目“string”。区分大小写。

cJSON_ArrayForEach(element, array);
//带参数宏定义,遍历数组array中的element元素

CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);//将cJSON打印

应用举例:

//recvbuf={"results":[{"location":{"id":"WS0E9D8WN298","name":"广州","country":"CN","path":"广州,广州,广东,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"阴","code":"9","temperature":"27"},"last_update":"2024-06-11T19:38:38+08:00"}]}
...
    cJSON *wea = cJSON_Parse(recvbuf); // 1.解析
    printf("%s\n", cJSON_Print(wea));  // 打印预览

    cJSON *results = cJSON_GetObjectItem(wea, "results"); // 2.打开遇到的第一个对象

    cJSON *result = NULL;
    cJSON_ArrayForEach(result, results) // 3.遍历"results"数组
    {
        cJSON *now = cJSON_GetObjectItem(result, "now");              // 将遇到的result对象中,如果存在“now”的元素就记录
        cJSON *temperature = cJSON_GetObjectItem(now, "temperature"); // 将遇到的now对象中,如果存在“temperature”的元素就记录
        printf("temperature :%d\n", atoi(temperature->valuestring));  // printf("temperature :%s\n", temperature->valuestring);
    }
...

输出结果

{
        "results":      [{
                        "location":     {
                                "id":   "WS0E9D8WN298",
                                "name": "广州",
                                "country":      "CN",
                                "path": "广州,广州,广东,中国",
                                "timezone":     "Asia/Shanghai",
                                "timezone_offset":      "+08:00"
                        },
                        "now":  {
                                "text": "阴",
                                "code": "9",
                                "temperature":  "27"
                        },
                        "last_update":  "2024-06-11T19:38:38+08:00"
                }]
}
temperature :27

生成JSON数据API及简单举例

(和下次的base64编码一起更新)

标签:const,temperature,cJSON,C语言,学习,item,JSON,小结
From: https://www.cnblogs.com/cino/p/18242643

相关文章

  • 图片相关web学习
    标签可以表示下标标签标示上标设置联系方式、地址。可以与段落标签、列表标签等一起用在进行网站架构时,一般将网站分为5部分,分别为:页眉;导航栏;主体部分;侧边栏;页脚。其中,经常与搭配使用在进行元素选择时,当没有合适语义的标签可供选择时,内联元素可以考虑块级元素选择我们使用来......
  • web学习1
    元素一个html元素主要由3部分构成:开始标签,内容,结束标签。例如:<em>最喜欢的食物是肉肉</em>。空元素不含结束标签,例如标签不同元素之间可以嵌套,需要注意的是块级元素不能嵌套在内联元素当中,内联元素可以嵌套在块级元素中在元素中,我们可以为元素添加属性。例如:<p>Alinktomy<a......
  • 单片机学习(9)--串口
    串口8.1串口通信1.串口介绍2.硬件电路3.电平标准4.接口及引脚定义5.常见通信接口比较6.相关术语6.51单片机的UART7.串口参数8.串口模式图8.串口和中断系统9.串口相关寄存器8.2串口向电脑发送数据,电脑通过串口控制LED1.串口向电脑发送数据程序(1)工程目录(2)main.c函数(3)UART......
  • PCIe学习——重点提纲
    PCIe学习-重点提纲基础知识计算机架构基础总线系统概述PCIvsPCI-XvsPCIePCIe概述PCIe的发展历史PCIe与其他总线的对比PCIe的优势和应用场景PCIe体系结构PCIe分层模型物理层(PhysicalLayer)数据链路层(DataLinkLayer)事务层(TransactionLayer)PCIe链......
  • 【课程总结】Day7:深度学习概述
    前言本篇文章,我们将通过示例来逐步学习理解导数、求函数最小值、深度学习的本质、以及使用numpy和pytorch实操深度学习训练过程。线性回归线性回归内容回顾在《【课程总结】Day5(下):PCA降维、SVD分解、聚类算法和集成学习》中,我们已经了解到线性回归以及线性回归可以表......
  • Django学习项目-learning log报错合集(2)
    样式篇stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css:1  Failedtoloadresource:net::ERR_CONNECTION_TIMED_OUTdjango-bootstrap3样式无效按这篇文章进行修改......
  • 访问器属性学习
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • ESP32学习笔记:NVS分区永久保存数据
    程序示例:/*ESP32startupcounterexamplewithPreferenceslibrary.ThissimpleexampledemonstratesusingthePreferenceslibrarytostorehowmanytimestheESP32modulehasbooted.ThePreferenceslibraryisawrapperaroundtheNon-volatilestorage......
  • SQL 数据库学习 Part 1
    数据和信息信息信息是客观存在的,是关于现实世界事物的存在方式或运动状态数据数据是用来记录信息的可识别的符号,是信息的具体表现形式数据和信息的联系数据是信息的符号表示或载体信息则是数据的内涵,是对数据的语义解释数据库定义数据库是长期存储在计算机内、有组织......
  • [学习JWT安全]JWT安全的学习笔记
    学习了JWT(jsonwebtoken),下边是笔记......