1.什么是JSON
JSON是JavaScript Object Notation的缩写,它是一种轻量级的数据交换格式,并不是协议。
JSON独立于语言与平台,现在很多编程语言都支持JSON,所以它是跨语言,跨平台的首选的数据交换格式。
2.JSON的应用场景
web开发:通常应用于前端与后端之间传递数据,也就是网页和服务器之间。
API开发:应用程序之间进行数据传送
3.JSON的数据类型
- number:数字型,和JavaScript的number完全一致;包括整型和浮点
- boolean:就是JavaScript的true或false;相当于c++中的bool类型
- string:就是JavaScript的string;相当于c++的string类型
- null:就是JavaScript的null;相当于C的NULL类型
- array:就是JavaScript的Array表示方式——[];相当于C的数组
- object:就是JavaScript的{ ... }表示方式。相当于C++的类或者C的结构体
4.JSON的格式规范
- json以大括号起始和结尾
- 内容都是以键值对的形式存在
- 所有的键都是字符串
- 值的类型不一定,属于JavaScript 的基本数据类型
- 每个键值对以
,
分割 - 最后一个键值对不加逗号
{
"name": "小明",
"age": 14,
"gender": true,
"height": 1.65,
"grade": null,
"skills": [
"JavaScript",
"Java",
"Python",
"Lisp"
]
}
5.JSON的分类
JSON分为对象(结点)---object 和数组----array
对象是由大括号{}里面有很多键值对,也可以包含数组
数组是由中括号[]里面可以包含很多对象{}
6.JSON与CJSON的关系
CJSON实质上就是一个用c语言实现的JSON库,允许使用C语言的语法生成和处理JSON数据。
7.利用CJSON实现序列化和反序列化
CJSON库提供函数接口
/* 类型定义 */
#define cJSON_False 0
#define cJSON_True 1
#define cJSON_NULL 2
#define cJSON_Number 3
#define cJSON_String 4
#define cJSON_Array 5
#define cJSON_Object 6
/* CJSON核心结构体 */
typedef struct cJSON {
struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
int type; /* 节点的类型,取值是上面的6种 */
char *valuestring; /* 如果类型是cJSON_String,那么值会被存到这里 */
int valueint; /* 如果类型是cJSON_Number,且是整型,那么值会被存到这里 */
double valuedouble; /* 如果类型是cJSON_Number,且是浮点型,那么值会被存到这里 */
char *string; /* 键*/
} cJSON;
/****************************通用接口****************************/
//把传入的字符串转成cJSON的结构(反序列化)
cJSON *cJSON_Parse(const char *value);
//把cJSON结构转成字符串(序列化),调用后需要配合free接口释放malloc的内存
char *cJSON_Print(cJSON *item);
//无格式化序列化,节省内存,调用后需要配合free接口释放malloc的内存
char *cJSON_PrintUnformatted(cJSON *item);
//释放节点的内存,防止内存泄露
void cJSON_Delete(cJSON *c);
/****************************反序列化相关接口****************************/
//获取数组的大小
int cJSON_GetArraySize(cJSON *array);
//从array数组中获取第item个子节点
cJSON *cJSON_GetArrayItem(cJSON *array, int index);
//获取object大节点名字叫string的子节点
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
//判断object大节点中是否有名字叫string的小节点
int cJSON_HasObjectItem(cJSON *object,const char *string);
/****************************序列化相关接口****************************/
//创建一个普通节点
cJSON *cJSON_CreateObject(void);
//创建一个数组节点
cJSON *cJSON_CreateArray(void);
//把item节点增加到array的数组节点中
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
//把item节点增加到object中作为子节点,item节点的键名为string
void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
//创建各种类型的cJSON节点
cJSON *cJSON_CreateNull(void);
cJSON *cJSON_CreateTrue(void);
cJSON *cJSON_CreateFalse(void);
cJSON *cJSON_CreateBool(int b);
cJSON *cJSON_CreateNumber(double num); //这个接口只需要传入整形形参,double会自动强转
cJSON *cJSON_CreateString(const char *string);
cJSON *cJSON_CreateArray(void);
cJSON *cJSON_CreateObject(void);
序列化:
可以理解为利用程序生成Json字符串的过程
第一步:创建一个根节点(root)
cJSON * root=cJSON_CreateObject();
第二步:创建键值对,根据值的选择不同的函数接口
cJSON * item=cJSON_CreateNumber(num);
第三步:创建数组/
cJSON * data=cJSON_CreateObject();
第四步:将键值对添加到根对象,将子对象添加给数组
cJSON_AddItemToArray(cJSON *array, cJSON *item);
cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
第五步:将根对象序列化
char *cJSON_Print(cJSON *item);
char *cJSON_PrintUnformatted(cJSON *item);---无格式化的序列化也就是把空格都删除了。
第六步:将字符串写到写入指定的文件中
可以用文件io和标准io都行
第七步:内存释放
free()
void cJSON_Delete(cJSON *c);
反序列化
利用程序将已有的Json字符串解析出我们需要的值的过程
第一步:读取指定文件的字符串
标准io/文件io均可
第二步:将字符串解析成根对象(或者理解成树)
cJSON *cJSON_Parse(const char *value);
第三步:根据层次关系,取出对应的对象中的键值对
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);
第四步:释放内存
void cJSON_Delete(cJSON *c);
谢谢您的关注,坚持看到这里的人,一定能取得成功!!!!!