【MQTT】cJSON的安装和使用

cJSON的简介

cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。

我们在使用JSON格式时,如果只是处理简单的协议,可以依据JSON格式,通过对字符串的操作来进行解析与创建。然而随着协议逐渐复杂起来,经常会遇到一些未考虑周全的地方,需要进一步的完善解析方法,此时,使用比较完善的JSON解析库的需求就提出来了。

基于方便引用的考虑,我们希望这个JSON解析库是用C语言实现的。同时,为了避免太过复杂的C源码包含关系,希望最好是一个C文件来实现。通过在网络上的查找,发现cJSON是比较符合要求的。cJSON只有一个C文件,一个头文件,包含到项目源码中非常方便,而且其实现效率也是非常高的。

1.JSON指的是JavaScript对象表示法(JavaScript Object Notation)
2.JSON是轻量级的文本数据交换格式
3.JSON独立于语言
4.JSON具有自我描述性,更易理解
5.JSON 使用 JavaScript 语法来描述数据对象,但是 JSON仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。

JSON语法简单来说就是四条

JSON 语法是 JavaScript 对象表示语法的子集。

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号 {} 保存对象
  • 中括号 [] 保存数组,数组可以包含多个对象

JSON 名称/值对

JSON 数据的书写格式是:
key : value

名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"name" : "张三"

这很容易理解,等价于这条 JavaScript 语句:
name = "张三"

JSON 数字

JSON 数字可以是整型或者浮点型:

{ "age":30 }

JSON 对象

JSON 对象在大括号 {} 中书写:

{key1 : value1, key2 : value2, ... keyN : valueN }

对象可以包含多个名称/值对:

{ "name":"百度" , "url":"www.baibu.com" }

这一点也容易理解,与这条 JavaScript 语句等价:

name = "百度"
url = "www.baidu.com"

JSON 数组

JSON 数组在中括号[ ] 中书写:
数组可包含多个对象:

{
    "sites": [
        { "name":"百度" , "url":"www.baidu.com" }, 
        { "name":"google" , "url":"www.google.com" }, 
        { "name":"阿里云" , "url":"www.alyun.com" }
    ]
}

cJSON库下载

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

下载完成后进入文件夹可以看到cJSON.che cJSON.h二个.c文件.
在这里插入图片描述
把这两个放入你的项目中即可。编译时加上选项-lm因为cJSON源码中用到了math库。或者可以直接链接动态库和静态库.(运行make).

cJSON库函数

cJSON的核心结构体就是一个cJSON,理解了这个结构体,基本上对cJSON的使用就有了个基本概念了,该结构体具体定义如下:

typedef struct cJSON 
{
struct cJSON*next,*prev;   /* 遍历数组或对象链的前向或后向链表指针*/
struct cJSON *child;      /*数组或对象的孩子节点*/
int type;                 /* key的类型*/
char *valuestring;        /*字符串值*/
int valueint;             /* 整数值*/
double valuedouble;       /* 浮点数值*/
char *string;            /* key的名字*/
} cJSON;

说明:

  1. cJSON是使用链表来存储数据的,其访问方式很像一棵树。每一个节点可以有兄弟节点,通过next/prev指针来查找,它类似双向链表;每个节点也可以有孩子节点,通过child指针来访问,进入下一层。只有节点是对象或数组时才可以有孩子节点。

  2. type是键(key)的类型,一共有种取值,分别是:False,True,null,Number,String,Array,Object。
    若是Number类型,则valueint或valuedouble种存储着值,如期望的是int,则访问valueint,如期望的是double,则访问valuedouble,可以得到值。
    若是String类型的,则valuestring中存储着值,可以访问valuestring得到值。

  3. string中存放的是这个节点的名字,可以理解位key的名称。

cJSON *cJSON_CreateObject();
//创建一个json对象,返回一个cJSON结构体类型的指针。
    
cJSON *cJSON_CreateArray();
//创建一个数组对象,返回一个cJSON结构体类型的指针。

cJSON *cJSON_CreateString(const char *string);
//创建一个字符串对象,传入一个char *类型的字符串,返回一个cJSON结构体类型的指针。

void cJSON_AddItemToArray(cJSON *array, cJSON *item);
//向数组对象中添加一个元素,传入参数array为cJSON *结构体类型的指针,为数组对象,item为添加如数字对象中的对象指针。

void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
//向json对象中添加一对元素,object为json对象,string为加入一对元素中的name,item为加入一对元素中的value。

char *cJSON_Print(cJSON *item);
//将一个cJSON结构体代表的json对象转换为一个json格式的字符串。

void cJSON_Delete(cJSON *c)
//释放一个cJSON对象占用的内存空间。

测试代码

/*********************************************************************************
 *      Copyright:  (C) 2022 Ye Xingwei<2929273315@qq.com>
 *                  All rights reserved.
 *
 *       Filename:  1.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(2022年01月18日)
 *         Author:  Ye Xingwei <2929273315@qq.com>
 *      ChangeLog:  1, Release initial version on "2022年01月18日 19时04分28秒"
 *                 
 ********************************************************************************/
#include <stdio.h>
#include "cJSON.h"

int main()
{


    cJSON*root = cJSON_CreateObject();
    cJSON *item = cJSON_CreateObject();

    cJSON_AddItemToObject(root, "MQTT",cJSON_CreateString("MQTT->ID"));
    cJSON_AddItemToObject(root, "id",cJSON_CreateString("192.168.0.1"));
    cJSON_AddItemToObject(root, "params",cJSON_CreateString("123456"));
    cJSON_AddItemToObject(root, "temperature",cJSON_CreateString("30"));
    cJSON_AddItemToObject(root, "Version",cJSON_CreateString("1.0011"));

    char *msg = cJSON_Print(root);
    printf("%s\n",msg);

    cJSON_Delete(root);

    return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值