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)
说明:
- cJSON结构体是一个双向链表,child指针指向下一层。
- type是JSON对象的数据类型,可以是字符串、整型和浮点型
- 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文件中详细说明。