千万不要点开,Cjson入门快速使用看这篇就够了(CJSON入门操作以及问题讲解,CJSON对象删除出错)

CJSON快速入门
本文介绍CJSON库的安装、使用及常见操作,包括构建JSON结构体、转换为字符串、解析字符串及提取数据,适合初学者快速掌握CJSON基本操作。

一、前言

在很多通讯领域,我们常用到json的通讯格式,然而在嵌入式开发当中我们在使用json格式的协议时,难免会使用到这一个cjson函数库。本文就是给一些CJSON快速入门的操作。
这一点一定要看啊,我们要首先明确我们的目的。加入我们不知道使用CJSON和JSON为了干什么,那么看这篇文章将将会十分困难。其实使用CJSON和JSON其实只是为了干一件事:那就是解析收到的数据和发送对方能够解析的数据,那么cjson就是我们用的工具,我们用这个工具来编辑和解析JSON格式的数据,知道这一点,下面的文章就很容易看懂了。

二、json讲解

我们要知道,这个东西只是一个数据交换格式,什么叫数据交换格式,就像一个电话簿一样,名字对应电话号码,好一点的可能还带着地址。但是就像我们打魂斗罗按baba上上下下左左右右可以挑出30条命一样,搞清楚是上上下下而不是下下上上对于我们打游戏没有用?我们只需要按出来就可以啦。同理,json也是这样,我们只需要是这个格式就可以啦。

2.1、json和cjson是什么

json百度百科:有时间可以看一下==json百度百科==
但是,其实也不用看,因为我们是要使用库的,已经有cjson库来帮我们处理数据,我们只需要将json数据当作一个黑盒子,然后使用cjson来添加、删除、解析和构造数据就可以啦。

2.2、json概述

JSON里面主要是按照键值对的方式来存储数据的,所以我们提取数据就按照键的名字直接提取,存入数据,就将想要存入的数据取一个名字(即字符串)然后放到JSON结构体里面就可以了。
这是一个典型的JSON结构体,我们可以看到,键名为“name”的值对应为"John Doe",而键名“address”的值则是一个用大括号括起来的数据,这是区别于c语言的一种数据类型,我们把它叫做对象。
给出一个json例子,让大家有个体会:

{
   
   
"name": "John Doe", 
"age": 18, 
"address": {
   
   "country" : "china", "zip-code": "10000"}
}

2.3、json数据类型分类

作为熟悉C语言的大家,json其实只有两种区别于c语言的数据类型,我们看看这两种就可以啦。
1、对象:json数据的主要单位,也就是一个用大括号括起来的数据,他包含的所有数据是各种键值对,键值对之间用逗号加以区分。注意我们用cjson操作时,也主要是对对象的操作
2、键值对:json数据的基本单位,键值对的键名必须是一个字符串,而键值则可以是int,double,string,array等各种数据。中间用冒号链接

/***对象*/
//对象:用大括号括起来的数据:
{
   
   “name”:"hello"}

/**键值对*/
//数组:用中括号括起来的数据:
{
   
   "array":[1,2,3]}
//字符串键值对
"key":"value"
//number键值对
"number":2

三、CJSON讲解

3.1、cjson安装:

这个是cjson的官方库,直接点击进,下载,解压缩
然后我们,可以看到很多文件,但是,我们不需要这么多,使用cjson只需要两个文件:

CJOSN.h
CJSON.c

把这两个文件添加进入自己的工程就可以啦,当然如果新手不知道怎么开始,将test.c这个文件也加进去,然后试验一下也是可以的。

3.2、cjson文件说明

我们只需要熟悉CJSON.h这个文件就可以,因为我们只需要调用这个.h里面的文件而已:

3.3、cjson函数讲解

3.3.1、json数据如何传输

我们现在已经知道json数据是一个结构体,那么如何传输结构体了?要知道,数据在网络或者无线通信中传输的都是二进制数据,我们如果要按照特殊的通讯协议来传输的话,我们就要按照这个协议解析。所以按照这个规则,我们直接双方都采用json格式的数据,然后采用相同的方式解析就可以啦。
这种方式大家都非常熟悉,我们直接将JSON数据转换成为字符串,然后传输,之后将字符串解析成JSON数据就可以啦

3.3.2、CJSON结构体:

/* The cJSON structure: */
typedef struct cJSON
{
   
   
//这些不用管
    struct cJSON *next;
    struct cJSON *prev;
    struct cJSON *child;

//这些都要知道
    //该json对象的类型,可以是字符串,int,double....
    int type;
    /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
    //如果类型是字符串,那么键值的字符串的值存在这里
    char *valuestring;
    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
     //如果类型是int,那么值存在这里
    int valueint;
    /* The item's number, if type==cJSON_Number */
    //如果类型是double,那么值存在这里
    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.3.3、CJSON解析和构造函数:

下面都是将JSON结构体转换为字符串数据的操作函数

//将CJSON数据转换为字符串(保留原来的格式:例如会保留空格和回车)
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
//将CJSON数据转换为字符串(删除所有格式,只保留文本)
CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
//将CJSON数据转换为字符串(并且存储到一个buffer里面)
CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);
//将CJSON数据转换为字符串(储存到一个动态申请的空间中)
CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);

下面都是将JSON字符串转换为JSON结构体的操作:

//将json字符串转换为结构体,并且将其赋给一个指针
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
//将json字符串转换为结构体,并且将其赋给一个指针,这个函数会提供一些操作选项来帮助开发者使用
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值