【MQTT】cJSON协议的安装和使用

cJSON的使用

*
cJSON的简介

+ JSON 名称/值对
+ JSON 数字
+ JSON 对象
+ JSON 数组
cJSON库下载
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文件.

【MQTT】cJSON协议的安装和使用
把这两个放入你的项目中即可。编译时加上选项-lm因为cJSON源码中用到了math库。或者可以直接链接动态库和静态库.(运行make).

cJSON库函数

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

typedef struct cJSON
{
struct cJSON*next,*prev;
struct cJSON *child;
int type;
char *valuestring;
int valueint;
double valuedouble;
char *string;
} 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();

cJSON *cJSON_CreateArray();

cJSON *cJSON_CreateString(const char *string);

void cJSON_AddItemToArray(cJSON *array, cJSON *item);

void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);

char *cJSON_Print(cJSON *item);

void cJSON_Delete(cJSON *c)

测试代码

#include
#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;
}

【MQTT】cJSON协议的安装和使用

Original: https://www.cnblogs.com/Ye-Wei/p/16728607.html
Author: 西故黄鹤楼
Title: 【MQTT】cJSON协议的安装和使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606322/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 等保测评2.0:Windows安全审计

    1、应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计 方案: 在管理工具打开本地安全策略,打开路径:安全设置\本地策略\审核策略,将全部审核策略配置为…

    Linux 2023年6月8日
    0119
  • phpcms抛出的二维数组转移到js,js中for….in遍历数组,用“.”连接来读出一维数组值

    直切正题: 1.phpcms在模版中读出数组有很多中方法,如,{pc:content action=”lists”}或{pc:get sql=”…

    Linux 2023年6月13日
    0135
  • MySQL双主同步的实现

    双主复制: 在两个节点上都可以写入数据,互为主从节点。 解决单点失败的问题:一个主节点失败,所有节点都会失败。 双主配置: (1) 各节点使用一个惟一server_id (2) 都…

    Linux 2023年6月7日
    0142
  • 从零开始制作一个linux iso镜像

    一、前言 对于一个极简化的linux系统而言,只需要三个部分就能组成,它们分别是一个linux内核、一个根文件系统和引导。以下是本文制作linux iso镜像所用到的系统和软件: …

    Linux 2023年5月27日
    0121
  • docker相关命令杂理

    – 2020.11.16docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] #保存现有的镜像 # docker commit …

    Linux 2023年6月8日
    0126
  • Popovers

    弹出式窗口弹出式窗口是一个短暂的视图,当你点击一个控件或一个区域时,它就会出现在屏幕上的其他内容之上。通常情况下,弹出窗口包括一个箭头,指向它出现的位置。弹出式窗口可以是非模态或模…

    Linux 2023年6月7日
    0143
  • docker与kubectl 命令自动补齐

    安装自动补齐需要依赖工具 docker命令补齐: 执行下列命令 kubectl命令补齐: Original: https://www.cnblogs.com/qianyuliang…

    Linux 2023年6月8日
    0116
  • zabbix快速安装(yum)

    1、先卸载系统自带数据库 [root@bogon ~]# rpm -e mariadb-libs-5.5.56-2.el7.x86_64 –nodeps 2、安装mys…

    Linux 2023年6月6日
    0116
  • K8s-二进制安装

    K8S-二进制安装使用 1.IP总规划 服务类型 ip地址 组件 k8s-master01 etcd集群节点1 192.168.80.20 kube-apiserver、kube-…

    Linux 2023年6月13日
    0129
  • 如何提高团队开发质量

    年轻的时候去面过一个相对于当时我的比较高端的管理岗位,当时的我情况是,开发经验相对丰富, 但管理经验还欠缺。对方当时面临一个具体的问题。 “我们最近生产上,出现了一个比…

    Linux 2023年6月13日
    0111
  • shell join详解

    首先贴一个,join –help 然后来理解下。 join 【命令选项】 文件1 文件2 //命令选项可以很多, 但文件只能是两个 先从重要的开始说,join 的作用是…

    Linux 2023年5月28日
    0117
  • Java实现链表

    3、链表 MyLinkedList 有一个头指针,一个尾指针,还有链表长度size 内有两个类,一个是实现了Iterator接口的迭代器类,另一个是Node类,其中Node数据结构…

    Linux 2023年6月14日
    0134
  • 【MQTT】iniparser库的安装和使用

    iniparser库 * – iniparser库介绍 – 下载库 – iniparser中的API – dictionary中的一…

    Linux 2023年6月13日
    0141
  • Redis 常用五种数据类型编码

    1.String 1.1 常用命令 (1)设置值 set key value [ex seconds] [px milliseconds] [nx|xx] set命令有几个选项: …

    Linux 2023年5月28日
    0141
  • Docker部署mysql 5.7

    在CentOS或者Linux创建部署目录,用于存放容器的配置和MySQL数据;目的是当重装或者升级容器时,配置文件和数据不会丢失。执行以下命令: a、创建目录: mkdir -p …

    Linux 2023年6月7日
    0114
  • Java语言高级(第六部分)函数式接口 Stream流、方法引用 ->(个人学习记录笔记)

    第一章 函数式接口 1.1 概念 函数式接口在Java中是指: 有且仅有一个抽象方法的接口。 函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda…

    Linux 2023年6月8日
    0121
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球