JSON的详细说明

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);

谢谢您的关注,坚持看到这里的人,一定能取得成功!!!!!

  

  

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值