文章目录
cJSON系列:
一,什么是json
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。
在程序之间进行数据交换过程中,特别是在互联网的轻量数据通信中json格式数据广泛应用。
以下是一个简单的json数据的例子:
{
"years": 22,
"name": "fool",
"man": true,
"adult": false,
"season": ["spring", "summer", "fall","winter"],
"money": null,
"child": {
"girlfriend": "june",
"boyfriend" : null
}
}
上述例子表明json是以“键-值”对的形式保存数据,每一个键值对可以称为一个item,一个json类型的数据可以有多个item,item数据类型包括:整型,字符串,布尔值,null,数组,以及json。
冒号左边的字符串是键,右边则是值。键必须是字符串,而值可有多种数据类型。在读取,写入,修改,删除数据时,都是根据键来对值进行操作。
二,应用场景示例
当需要从互联网获取天气数据时,可向查询天气接口发起请求,注意它的返回数据格式就是json
点击进入API测试工具,点击模拟调用接口,右侧的窗口就会返回以json格式的天气数据。
三,学习cjson的关键
cjson就是用来处理json格式数据的一个库。cjson是使用c语言编写的,它十分轻量级,可用在内存有限的嵌入式设备中,来处理与互联网的交互数据。
cjson的github地址:https://github.com/DaveGamble/cJSON;cjson的代码主要在cJSON.c
和cJSON_Utils.c
这两个文件中,其中最主要功能的是由cJSON.c
实现。
它实现了对json数据的基本操作,如:生成json数据,解析json数据,对json的增删改读等。
因为json的所有操作都是以cjson结构体为对象的,所以学习cjson的关键在于掌握cjson结构体与json格式数据的对应关系,理解了这一点,对于源码的逻辑就会有更加清晰的认识。
cjson结构体的定义以及类型如下:
/* cJSON Types: */
#define cJSON_Invalid (0) //非法类型
#define cJSON_False (1 << 0)
#define cJSON_True (1 << 1)
#define cJSON_NULL (1 << 2)
#define cJSON_Number (1 << 3)
#define cJSON_String (1 << 4)
#define cJSON_Array (1 << 5) //数组类型
#define cJSON_Object (1 << 6) //json类型
#define cJSON_Raw (1 << 7) /* raw json */
#define cJSON_IsReference 256 //cjson是否参考外部另一个cjson
#define cJSON_StringIsConst 512 //字符串是否是常量
/* The cJSON structure: */
typedef struct cJSON
{
struct cJSON *next; //链表中的下一个cjson
struct cJSON *prev; //链表中的上一个cjson
struct cJSON *child; //指向下一层的cjson(object或数组)
int type; //json类型
char *valuestring; //存放字符串
int valueint; //存放整型值
/* The item's number, if type==cJSON_Number */
double valuedouble; //存放双精度数据
char *string; //键key
} cJSON;
cjson与json的具体对应关系如下:一个cjson结构体可以看作一个item,也就是一个"键-值"对(eg:“years”: 22),当item的类型为object时,表示这个item是一个json数据,这个json数据下可以有若干个item,以此实现嵌套。请认真理解下图的关系。
小结
随着物联网的越来越热闹,嵌入式设备中应对数据交换的情况也越复杂,具备对json数据的处理能力是一个嵌入式物联网设备的必须能力要求。
在下一篇我将介绍如何简单的使用cjson创建json数据。
linux下安装cjson
参考博客:https://blog.csdn.net/woay2008/article/details/94367652