
cjson 的代码只有 1000+ 行, 而且只是简单的几个函数的调用。
而且 cjson 还有很多不完善的地方, 推荐大家看完之后自己实现一个 封装好的功能完善的 cjson 程序。
在阅读 json 之前, 建议阅读一下 json 的官方介绍。
如果上面的英文吓到你了的话, 可以看看这个中文翻译版本.
我的 这个 cjson 是从官网指定的地方下载的 ourceforge.
在看完官网的介绍后,我们知道 json 的 value 存在这么几种类型: 对象, 数组, 字符串, 数字, true, false, null。
其中对象是一个 key-value 的集合, 而数组是一些 value 的有序列表。
于是 cjson 中在 头文件中定义了 这些类型的数字编号和 cJSON value 的结构体。
/* 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 , 如果是我的话,会选择 emnu 来实现这个类型的定义。
例如
enum {cJSON_False, cJSON_True, cJSON_NULL, cJSON_Number, cJSON_String, cJSON_Array, cJSON_Object, cJSON_IsReference=256};
然后是 json 一个 value 的结构,看注释也都可以明白干什么的。
/* The cJSON structure: */
typedef struct cJSON {
struct cJSON *next,*prev; /同一级的元素使用双向列表储存/
struct cJSON *child; /* 如果是个 object 或 array 的话,第一个儿子的指针 */
int type; /* value 的类型 */
char *valuestring; /* 如果这个 value 是 字符串 的话,字符串值 */
int valueint; /* 如果是数字的话,整数值 */
double valuedouble; /* 如果是数字的话,浮点数值 */
char *string; /* 如果是对象的 key-value 元素的话, key 值 */
} cJSON;
在 c 语言中内存一般是 malloc 和 free 的。
为了方便用户自由的管理内存, cjson 使用 Hook 技术来让使用者可以自定义内存管理函数。
即用户自定义 malloc 和 free.
具体实现方式可以参考下面的代码, 默认使用系统的 malloc 和 free 函数, 用过 cJSON_InitHooks 函数可以替换成用户自定义的 malloc 和 free 函数。
typedef struct cJSON_Hooks {
void *(*malloc_fn)(size_t sz);
void (*free_fn)(void *ptr);
} cJSON_Hooks;
static void *(*cJSON_malloc)(size_t sz) = malloc;
static void (*cJSON_free)(void *ptr) = 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;
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-57098-1.html
迅速崛起
质检总局都是摆设