cJSON源码研究(一)

What's JSON?

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。(百度)

源码文件

源码文件主要是:cJSON.h头文件和cJSON.c文件

头文件cJSON.h

从头文件cJSON.h读起。浏览一遍代码。
发现在其中定义了各种各种数据类型数据结构函数接口宏定义

首先,我们会看到头文件的开头和结尾这样的语句:

#ifndef cJSON__h  
#define cJSON__h  
  
#ifdef __cplusplus  
extern "C"  
{  
#endif  
#ifdef __cplusplus  
}  
#endif  
  
#endif  

#ifndef cJSON_h,#define cJSON_h,#endif . 这是为了防止头文件被重复引用。

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。

  •  cJSON Types

#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
    
#define cJSON_IsReference 256
#define cJSON_StringIsConst 512


这些宏定义是对结构体type的值定义,处理时只需要将type的值&255进行位运算,即可得到json里储存的数据类型。

  •  cJSON structure

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;					/* The type of the item, as above. */

	char *valuestring;			/* The item's string, if type==cJSON_String */
	int valueint;				/* The item's number, if type==cJSON_Number */
	double valuedouble;			/* The item's number, if type==cJSON_Number */

	char *string;				/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;

这就是JSON的数据结构(structure)

说明:

  1. cJSON结构体是一个双向链表,child指针指向下一层。
  2. type是JSON对象的数据类型,可以是字符串、整型和浮点型
  3. string是该节点的名称
  • cJSON_Hooks(内存管理结构体)

typedef struct cJSON_Hooks {
      void *(*malloc_fn)(size_t sz);
      void (*free_fn)(void *ptr);
} cJSON_Hooks;

cJSON使用cJSON_Hooks结构体进行内存管理,cJSON_Hooks结构体由内存分配内存释放函数组成。

它们都是函数指针

为了内容的连贯,我们进入.c文件找到cJSON_InitHooks函数。

Hooks初始化函数可以看出,如果hooks没有自定义的内存分配和释放函数,默认使用malloc和free函数。

static void *(*cJSON_malloc)(size_t sz) = malloc;//cJSON_malloc指向malloc
static void (*cJSON_free)(void *ptr) = free;//cJSON_free指向free

void cJSON_InitHooks(cJSON_Hooks* hooks)
{
    if (!hooks) { /* Reset hooks */
        cJSON_malloc = malloc;
        cJSON_free = free;
        return;
    }

	cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc;
	cJSON_free	 = (hooks->free_fn)?hooks->free_fn:free;
}

剩下的内容都是函数接口和宏定义。这部分在.c文件中详细说明。

 

上一篇:如何优雅的使用react hooks来进行状态管理


下一篇:React Hooks究竟是什么呢?