3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

cJSON源码及解析流程详解

發(fā)布時(shí)間:2024/2/28 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cJSON源码及解析流程详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

cJSON簡介

cJSON.h

cJSON結(jié)構(gòu)

cJSON結(jié)點(diǎn)的創(chuàng)建

cJSON解析

parse_objec( )

parse_array( )

parse_number( )

parse_string( )

cJSON打印

其他函數(shù)

?

cJSON簡介

JSON(JavaScript?Object Notation, JS 對象簡譜) 是一種輕量級的數(shù)據(jù)交換格式。它基于?ECMAScript?(歐洲計(jì)算機(jī)協(xié)會制定的js規(guī)范)的一個(gè)子集,采用完全獨(dú)立于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言。 易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率。cJSON從名字可知,整個(gè)項(xiàng)目都是以極標(biāo)準(zhǔn)的C來寫的,意思說,可以跨各種平臺使用了。cJSON是一個(gè)超輕巧,攜帶方便,單文件,簡單的可以作為ANSI-C標(biāo)準(zhǔn)的JSON解析器。

cJSON官網(wǎng)下載:https://sourceforge.net/projects/cjson/

cJSON ?GitHub:https://github.com/DaveGamble/cJSON

說明:本篇博文分析的源碼是在官網(wǎng)下載的,最后更新時(shí)間是2016-9-23。GitHub上的源代碼更新,同時(shí)其代碼量也更大。但它們的核心代碼和思想差不多,各位可以根據(jù)自身需求選擇。

?

cJSON.h

因?yàn)轭^文件的內(nèi)容不是很多,所以我將其全部羅列出來,其中的核心函數(shù)是解析函數(shù)和打印函數(shù)。只要清楚cJSON的數(shù)據(jù)結(jié)構(gòu)后,看相應(yīng)的代碼才能比較簡單。頭文件中并沒有包含所有的函數(shù),有的函數(shù)是在cJSON.c中定義的,一般是在解析過程中重復(fù)次數(shù)較多的函數(shù)。

#ifndef cJSON__h #define cJSON__h#ifdef __cplusplus extern "C" //extern "C"的主要作用就是為了能夠正確實(shí)現(xiàn)C++代碼調(diào)用其他C語言代碼。加上extern "C"后, //會指示編譯器這部分代碼按C語言的進(jìn)行編譯,而不是C++的。由于C++支持函數(shù)重載,因此編譯 //器編譯函數(shù)的過程中會將函數(shù)的參數(shù)類型也加到編譯后的代碼中,而不僅僅是函數(shù)名;而C語言 //并不支持函數(shù)重載,因此編譯C語言代碼的函數(shù)時(shí)不會帶上函數(shù)的參數(shù)類型,一般之包括函數(shù)名。 { #endif/* 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/* cJSON結(jié)構(gòu)體: */ typedef struct cJSON {struct cJSON *next,*prev; /* next/prev結(jié)構(gòu)體指針允許你遍歷數(shù)組/對象鏈。另外,使用GetArraySize 、 GetArrayItem 、 GetObjectItem方法獲取相應(yīng)的項(xiàng)。 */struct cJSON *child; /* 數(shù)組或?qū)ο髮⒂幸粋€(gè)child指針指向數(shù)組/對象中的頭結(jié)點(diǎn)。 */int type; /* 項(xiàng)的類型 */char *valuestring; /* 如果type==cJSON_String,則是字符串。 */int valueint; /* 如果type==cJSON_Number,則是int。 */double valuedouble; /* 如果type==cJSON_Number,則是double。 */char *string; /* json對象的名稱。 */ } cJSON;/* 該結(jié)構(gòu)體提供了分配和釋放空間的函數(shù)指針 */ typedef struct cJSON_Hooks {void *(*malloc_fn)(size_t sz);void (*free_fn)(void *ptr); } cJSON_Hooks;/* 向cJSON提供malloc和free函數(shù) */ extern void cJSON_InitHooks(cJSON_Hooks* hooks);/* 提供一個(gè)JSON塊,然后返回一個(gè)可以查詢的cJSON對象。完成后調(diào)用cJSON_Delete。 */ extern cJSON *cJSON_Parse(const char *value); /* 將cJSON實(shí)體呈現(xiàn)為用于傳輸/存儲的文本。完成后釋放char*。 */ extern char *cJSON_Print(cJSON *item); /* 將cJSON實(shí)體呈現(xiàn)為用于傳輸/存儲的文本,而不進(jìn)行任何格式化。完成后釋放char*。 */ extern char *cJSON_PrintUnformatted(cJSON *item); /* 使用緩沖策略將cJSON實(shí)體呈現(xiàn)為文本。預(yù)緩沖是對最終大小的猜測。猜測減少了重新分配。fmt=0表示無格式,=1表示有格式 */ extern char *cJSON_PrintBuffered(cJSON *item,int prebuffer,int fmt); /* 刪除一個(gè)cJSON實(shí)體和所有子實(shí)體。 */ extern void cJSON_Delete(cJSON *c);/* 返回?cái)?shù)組(或?qū)ο?中的項(xiàng)數(shù)。 */ extern int cJSON_GetArraySize(cJSON *array); /* 從數(shù)組“數(shù)組”中檢索項(xiàng)目編號“項(xiàng)目”。如果不成功,返回NULL。 */ extern cJSON *cJSON_GetArrayItem(cJSON *array,int item); /* 從對象中獲取項(xiàng)目"string"。不區(qū)分大小寫。 */ extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);/* 用于分析失敗的語法。這將返回一個(gè)指向解析錯(cuò)誤的指針。 你可能需要回頭看幾個(gè)字才能理解它。當(dāng)cJSON_Parse()返回0時(shí)定義。當(dāng)cJSON_Parse()成功時(shí)為0。 */ extern const char *cJSON_GetErrorPtr(void);/* 這些調(diào)用創(chuàng)建適當(dāng)Type的cJSON項(xiàng)。 */ extern cJSON *cJSON_CreateNull(void); extern cJSON *cJSON_CreateTrue(void); extern cJSON *cJSON_CreateFalse(void); extern cJSON *cJSON_CreateBool(int b); extern cJSON *cJSON_CreateNumber(double num); extern cJSON *cJSON_CreateString(const char *string); extern cJSON *cJSON_CreateArray(void); extern cJSON *cJSON_CreateObject(void);/* 根據(jù)count創(chuàng)建數(shù)組。 */ extern cJSON *cJSON_CreateIntArray(const int *numbers,int count); extern cJSON *cJSON_CreateFloatArray(const float *numbers,int count); extern cJSON *cJSON_CreateDoubleArray(const double *numbers,int count); extern cJSON *cJSON_CreateStringArray(const char **strings,int count);/* 向指定的數(shù)組/對象追加項(xiàng)。 */ extern void cJSON_AddItemToArray(cJSON *array, cJSON *item); extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item); extern void cJSON_AddItemToObjectCS(cJSON *object,const char *string,cJSON *item); /* 當(dāng)字符串確實(shí)是常量(例如,是一個(gè)文本,或者與常量一樣好),并且肯定會在cJSON對象中存活時(shí),就使用這個(gè)方法 */ /* 將對項(xiàng)的引用追加到指定的數(shù)組/對象。當(dāng)您想要將現(xiàn)有的cJSON添加到新的cJSON中,但又不想破壞現(xiàn)有的cJSON時(shí),可以使用此方法。 */ extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); extern void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item);/* 從數(shù)組/對象中刪除/分離項(xiàng)。 */ extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int which); extern void cJSON_DeleteItemFromArray(cJSON *array,int which); extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string); extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string);/* 更新數(shù)組項(xiàng) */ extern void cJSON_InsertItemInArray(cJSON *array,int which,cJSON *newitem); /* 將已存在的項(xiàng)目向右移動。 */ extern void cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem); extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);/* 復(fù)制一個(gè)cJSON項(xiàng)目 */ extern cJSON *cJSON_Duplicate(cJSON *item,int recurse); /* Duplicate將在需要釋放的新內(nèi)存中創(chuàng)建一個(gè)與傳遞的cJSON相同的新項(xiàng)目。 遞歸!=0,它將復(fù)制連接到該項(xiàng)的所有子元素。條目->next和->prev指針在從Duplicate返回時(shí)總是0。*//* ParseWithOpts允許您要求(并檢查)JSON是否以null結(jié)尾,并檢索指向解析后的最終字節(jié)的指針。 */ extern cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated);extern void cJSON_Minify(char *json);/* 用于快速創(chuàng)建內(nèi)容的宏。 */ #define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) #define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) #define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) #define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) #define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) #define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))/* 在分配整數(shù)值時(shí),也需要將其傳播到valuedouble。 */ #define cJSON_SetIntValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val)) #define cJSON_SetNumberValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val))#ifdef __cplusplus } #endif#endif

?

?

cJSON結(jié)構(gòu)

cjson的存儲結(jié)構(gòu)整體可以簡單的看成一條鏈表(單向),同一級別下的兄弟結(jié)點(diǎn)之間通過prev和next指針連接起來(雙向),prev和next分別指向cjson對象的前驅(qū)和后繼child則指向下一級結(jié)點(diǎn),這里通過名字也可以理解為指向孩子結(jié)點(diǎn)。以下是例子及其結(jié)構(gòu)圖:

{"Asd": [{ "賬號":"a123456789" , "密碼":"asdasdasd123456" },{ "賬號":"b123456789" , "密碼":"qweqweqwe123456" }] }

例子中的Asd是一個(gè)數(shù)組,里面存儲的內(nèi)容是對象。對象存儲的內(nèi)容是賬號和密碼,賬號結(jié)點(diǎn)和密碼結(jié)點(diǎn)的類型都是string,而string的值分別賦予了賬號和密碼意義。這里直接將cJSON結(jié)構(gòu)圖列出,是為了方便大家閱讀源代碼時(shí)方便理解。

?

cJSON結(jié)點(diǎn)的創(chuàng)建

結(jié)點(diǎn)創(chuàng)建函數(shù)很簡單,就是為cJSON結(jié)構(gòu)體申請空間并用memset進(jìn)行初始化,然而沒有設(shè)置結(jié)構(gòu)體內(nèi)的成員,后續(xù)根據(jù)需求再對結(jié)構(gòu)體中的類型進(jìn)行設(shè)置。可以看到下面的創(chuàng)建基本類型函數(shù),都是先調(diào)用cJSON_New_Item( ),再進(jìn)行成員設(shè)置。

/* 內(nèi)部構(gòu)造函數(shù),創(chuàng)建一個(gè)新的Item */ static cJSON *cJSON_New_Item(void) {cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON));if (node) memset(node,0,sizeof(cJSON)); //memset是計(jì)算機(jī)中C/C++語言初始化函數(shù)。作用是將某一塊內(nèi)存中的內(nèi)容全部設(shè)置為指定的值//這個(gè)函數(shù)通常為新申請的內(nèi)存做初始化工作。 原型:void *memset(void *s, int ch, size_t n);return node; } /* 創(chuàng)建基本類型: */ // 通過調(diào)用cJSON_New_Item()函數(shù)創(chuàng)建cJSON結(jié)構(gòu)體,再根據(jù)需求設(shè)置相應(yīng)的type,最后返回item。 cJSON *cJSON_CreateNull(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_NULL;return item;} cJSON *cJSON_CreateTrue(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_True;return item;} cJSON *cJSON_CreateFalse(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_False;return item;} cJSON *cJSON_CreateBool(int b) {cJSON *item=cJSON_New_Item();if(item)item->type=b?cJSON_True:cJSON_False;return item;} cJSON *cJSON_CreateNumber(double num) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_Number;item->valuedouble=num;item->valueint=(int)num;}return item;} cJSON *cJSON_CreateString(const char *string) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_String;item->valuestring=cJSON_strdup(string);}return item;} cJSON *cJSON_CreateArray(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Array;return item;} cJSON *cJSON_CreateObject(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Object;return item;}/* 頭文件中快速創(chuàng)建內(nèi)容的宏 */ /* 用于快速創(chuàng)建內(nèi)容的宏。 */ #define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) #define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) #define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) #define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) #define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) #define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))

?

?

cJSON解析

解析代碼是cJSON項(xiàng)目的核心代碼,它的流程圖如下:

cJSON解析的二次封裝:

/* cJSON_Parse的默認(rèn)選項(xiàng),用于將文本解析為JSON */ cJSON *cJSON_Parse(const char *value) {return cJSON_ParseWithOpts(value,0,0);} /* 解析一個(gè)對象,創(chuàng)建一個(gè)新的根,然后填充。 */ cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int require_null_terminated) {const char *end=0;cJSON *c=cJSON_New_Item(); //只是創(chuàng)建了一個(gè)cJSON結(jié)構(gòu)體,沒有其他操作。ep=0;if (!c) return 0; /* 內(nèi)存分配失敗,返回0 */end=parse_value(c,skip(value)); //skip只跳過開頭的控制字符 if (!end) {cJSON_Delete(c);return 0;} /* 解析失敗 *//* 如果我們需要沒有附加以null結(jié)尾的JSON,跳過,然后檢查是否有null終止符 *///函數(shù)中參數(shù)中提供了require_null_terminated是為了確保json字符串必須以'\0'字符作為結(jié)尾。//若參數(shù)提供了return_parse_end,將返回json字符串解析完成后剩余的部分。if (require_null_terminated) {end=skip(end);if (*end) {cJSON_Delete(c);ep=end;return 0;}}if (return_parse_end) *return_parse_end=end;return c; } /* 解析器核心——遇到文本時(shí),適當(dāng)?shù)靥幚怼?*/ static const char *parse_value(cJSON *item,const char *value) {if (!value) return 0; /* 不能為空,若為空,返回0 *///strncmp函數(shù)為字符串比較函數(shù),函數(shù)聲明為int strncmp ( const char * str1, const char * str2, size_t n );//若str1與str2的前n個(gè)字符相同,則返回0;若s1大于s2,則返回大于0的值;若s1 小于s2,則返回小于0的值。//對于json為null、true或者false的情況,直接將type置為對應(yīng)的類型即可。if (!strncmp(value,"null",4)) { item->type=cJSON_NULL; return value+4; }if (!strncmp(value,"false",5)) { item->type=cJSON_False; return value+5; }if (!strncmp(value,"true",4)) { item->type=cJSON_True; item->valueint=1; return value+4; }//以下需要了解JSON的結(jié)構(gòu)if (*value=='\"') { return parse_string(item,value); }if (*value=='-' || (*value>='0' && *value<='9')) { return parse_number(item,value); }if (*value=='[') { return parse_array(item,value); }if (*value=='{') { return parse_object(item,value); }ep=value;return 0; /* 失敗 */ }

前三步很簡單,調(diào)用cJSON_Parse(),其內(nèi)部為cJSON_ParseWithOpts(),它調(diào)用parse_value()函數(shù)進(jìn)行解析,這里函數(shù)首先調(diào)用cJSON_NewItem()創(chuàng)建節(jié)點(diǎn),用于存放解析的JSON結(jié)構(gòu)數(shù)據(jù)。然后根據(jù)不同的Type,再調(diào)用相應(yīng)的parse_string(),parse_number(),parse_array()或parse_objec()。對應(yīng)上面提到的cJSON的結(jié)構(gòu)圖,若是同一級下的結(jié)點(diǎn),會形成一個(gè)雙向鏈表,用于連接該級下的兄弟結(jié)點(diǎn)。若不是同一級,則會讓上一次結(jié)點(diǎn)的child指針指向新的結(jié)點(diǎn)。

?

parse_objec( )

接下來的代碼分析需要結(jié)合官方圖表才能更好的理解其原理。先說一下圖表,對于一個(gè)object而言,一定是從 " { " 開始, " } "結(jié)束。程序會先判斷該對象是不是為空,即" { " 后除了控制字符外,是不是只剩下?" } "。若是,則說明這個(gè)對象是空的。若不是,接下來會遇到whitespace和字符串。程序用skip() 巧妙地跳過了控制字符,方便了對象內(nèi)容的解析。你會發(fā)現(xiàn)代碼中有一段代碼是 value=skip(parse_string(child,skip(value))); ,這是因?yàn)樘^whitespace后,會直接遇到string類型的數(shù)據(jù)。而后會遇到 " :?",代碼中也進(jìn)行了相應(yīng)的處理,即value=skip(parse_value(child,skip(value+1)));?。當(dāng)string和value都處理完了后,可能還有別的內(nèi)容。這里的判斷條件是如果遇到 " , ",說明后續(xù)還有內(nèi)容,所以在while循環(huán)內(nèi)的代碼重復(fù)了上述的工作。在while中,會調(diào)用cJSON_New_Item( )創(chuàng)建新的結(jié)點(diǎn),然后將它們連接在一起(此時(shí)的內(nèi)容是同級的)。這里是對圖片和代碼的一個(gè)講解,大家可以先看看圖片,再去看代碼,這樣思路會清晰很多。

/* 跳轉(zhuǎn)空格和cr/lf的實(shí)用程序,但只會跳過第一個(gè)能顯示的字符之前的控制字符 */ // ASCII碼值小于32的為控制字符 static const char *skip(const char *in) {while (in && *in && (unsigned char)*in<=32) in++; return in;}/* 從文本構(gòu)建一個(gè)對象。 */ static const char *parse_object(cJSON *item,const char *value) {cJSON *child;if (*value!='{') {ep=value;return 0;} /* 不是一個(gè)對象! */item->type=cJSON_Object; //類型置為對象value=skip(value+1); //開始找{后的非控制字符if (*value=='}') return value+1; /* 若第一個(gè)非控制字符為},則內(nèi)容為空,即{}。 */item->child=child=cJSON_New_Item(); //為child分配空間,用child指向下一層結(jié)點(diǎn) if (!item->child) return 0; value=skip(parse_string(child,skip(value))); //由JSON的object結(jié)構(gòu)可知,在排除內(nèi)容為空的前提下,{后遇到的可能是//空格或字符串,所以用skip跳過空格,那么第一個(gè)直接遇到的就是字符串//所以直接調(diào)用parse_string()函數(shù)。最外層的skip函數(shù)可以直接指向':'。if (!value) return 0;child->string=child->valuestring;child->valuestring=0;if (*value!=':') {ep=value;return 0;} /* 失敗! */value=skip(parse_value(child,skip(value+1))); /* 跳過任何間距,獲取值。 */if (!value) return 0;while (*value==',') //','表明后面還有內(nèi)容,那么就將上述操作再進(jìn)行多次即可。{ cJSON *new_item;if (!(new_item=cJSON_New_Item())) return 0; /* 內(nèi)存錯(cuò)誤。 */child->next=new_item;new_item->prev=child;child=new_item;value=skip(parse_string(child,skip(value+1)));if (!value) return 0;child->string=child->valuestring;child->valuestring=0;if (*value!=':') {ep=value;return 0;} /* 失敗! */value=skip(parse_value(child,skip(value+1))); /* 跳過任何間距,獲取值。 */if (!value) return 0;}if (*value=='}') return value+1; /* 數(shù)組尾部 */ep=value;return 0; }

?

parse_array( )

同理對于一個(gè)array而言,一定是從 " [ " 開始, " ]?"結(jié)束。程序會先判斷該數(shù)組是不是為空,即" [?" 后除了控制字符外,是不是只剩下?" ]?"。若是,則說明這個(gè)數(shù)組是空的。若不是,接下來會遇到value。程序用skip() 跳過了控制字符,方便數(shù)組內(nèi)容的解析。這里的操作流程和思想和上述parse_objec()很像,而且array相對于object更簡單點(diǎn)。

/* 從輸入文本構(gòu)建一個(gè)數(shù)組。 */ static const char *parse_array(cJSON *item,const char *value) {//解析數(shù)組時(shí),其基本思想是對數(shù)組中每一個(gè)元素遞歸調(diào)用parse_value,再將這些元素連接形成一個(gè)鏈表。cJSON *child;if (*value!='[') {ep=value;return 0;} /* 不是一個(gè)數(shù)組! */item->type=cJSON_Array; //置類型為itemvalue=skip(value+1);if (*value==']') return value+1; /* 若為[],則為空數(shù)組。 */item->child=child=cJSON_New_Item();if (!item->child) return 0; /* 內(nèi)存錯(cuò)誤 */value=skip(parse_value(child,skip(value))); /* 跳過任何間距,獲取值。 */if (!value) return 0;while (*value==',') //','表明后面還有內(nèi)容,那么就將上述操作再進(jìn)行多次即可。 { //這一部分相對于parse_object()簡單的原因是','后是value。cJSON *new_item;if (!(new_item=cJSON_New_Item())) return 0; /* 內(nèi)存錯(cuò)誤 */child->next=new_item;new_item->prev=child;child=new_item;value=skip(parse_value(child,skip(value+1)));if (!value) return 0; /* 內(nèi)存錯(cuò)誤 */}if (*value==']') return value+1; /* 數(shù)組的尾部 */ep=value;return 0; }

?

parse_number( )

這一部分,函數(shù)比較簡單,反而是圖比較復(fù)雜,建議直接看代碼。

/* 解析輸入文本以生成數(shù)字,并將結(jié)果填充到項(xiàng)中。 */ static const char *parse_number(cJSON *item,const char *num) {double n=0,sign=1,scale=0;int subscale=0,signsubscale=1;if (*num=='-') sign=-1,num++; /* 有標(biāo)志? */if (*num=='0') num++; /* 是0 */if (*num>='1' && *num<='9') do n=(n*10.0)+(*num++ -'0'); while (*num>='0' && *num<='9'); /* 數(shù)字? */if (*num=='.' && num[1]>='0' && num[1]<='9') {num++; do n=(n*10.0)+(*num++ -'0'),scale--; while (*num>='0' && *num<='9');} /* 小數(shù)部分? */if (*num=='e' || *num=='E') /* 指數(shù)? */{ num++;if (*num=='+') num++; else if (*num=='-') signsubscale=-1,num++; /* 帶標(biāo)志? */while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0'); /* 數(shù)字? */}n=sign*n*pow(10.0,(scale+subscale*signsubscale)); /* number = +/- number.fraction * 10^+/- exponent *///double pow(double x, double y); 返回 x 的 y 次冪,即x^y。item->valuedouble=n;item->valueint=(int)n;item->type=cJSON_Number;return num; }

?

parse_string( )

對string的處理思想和上面的基本一樣,不同的是判斷條件的不一樣。因?yàn)樵创a中有一句注釋 /* UTF16 surrogate pairs。 */。百度后才知道它是什么意思,字面意義是:代理對。實(shí)際上是指:對于一個(gè)UTF16編碼改用兩個(gè)UTF16編碼來代替。本來一個(gè)字符用一個(gè)UTF16編碼(兩個(gè)字節(jié))來表示即可,但是由于需要被編碼的字符越來越多,只用一個(gè)UTF16編碼已經(jīng)不足于表示所有的字符。因此,就需要考慮使用2個(gè)UTF16來表示一個(gè)字符(四個(gè)字節(jié))。

static unsigned parse_hex4(const char *str) {unsigned h=0;if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0;h=h<<4;str++;if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0;h=h<<4;str++;if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0;h=h<<4;str++;if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0;return h; } /* 將輸入文本解析為未轉(zhuǎn)義的cstring,并填充項(xiàng)。 */ static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; static const char *parse_string(cJSON *item,const char *str) {const char *ptr=str+1;char *ptr2;char *out;int len=0;unsigned uc,uc2;if (*str!='\"') {ep=str;return 0;} /* 若開頭不是'"',則不是一個(gè)字符串! *///由定義ptr=str+1;可知,ptr指向字符串的第個(gè)字符while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; /* 跳過了引號。 */// "Asd qwe zxc!" 長度為12,"Asd \"qwe\" zxc!"長度為14。/* 除“或\或控制字符外的任何代碼點(diǎn) */out=(char*)cJSON_malloc(len+1); /* 這大概是我們需要的長度。 */if (!out) return 0;ptr=str+1;ptr2=out;while (*ptr!='\"' && *ptr){if (*ptr!='\\') *ptr2++=*ptr++;else{ptr++;switch (*ptr){case 'b': *ptr2++='\b'; break; //退格case 'f': *ptr2++='\f'; break; //跳頁case 'n': *ptr2++='\n'; break; //換行case 'r': *ptr2++='\r'; break; //回車case 't': *ptr2++='\t'; break; //水平tabcase 'u': /* utf16轉(zhuǎn)換utf8。 */uc=parse_hex4(ptr+1);ptr+=4; /* 獲取unicode字符。 */if ((uc>=0xDC00 && uc<=0xDFFF) || uc==0) break; /* 檢查無效的。 */if (uc>=0xD800 && uc<=0xDBFF) /* UTF16 surrogate pairs。 字面意義是:代理對。實(shí)際上是指:對于一個(gè)UTF16編碼改用兩個(gè)UTF16編碼來代替。*/{ //本來一個(gè)字符用一個(gè)UTF16編碼(兩個(gè)字節(jié))來表示即可,但是由于需要被編碼的字符越來越多,//只用一個(gè)UTF16編碼已經(jīng)不足于表示所有的字符。因此,就需要考慮使用2個(gè)UTF16來表示一個(gè)字符(四個(gè)字節(jié))。if (ptr[1]!='\\' || ptr[2]!='u') break; /* surrogate的下半部分不見了。 */uc2=parse_hex4(ptr+3);ptr+=6;if (uc2<0xDC00 || uc2>0xDFFF) break; /* surrogate的后半部分無效。*/uc=0x10000 + (((uc&0x3FF)<<10) | (uc2&0x3FF));}len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len;switch (len) {case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;case 1: *--ptr2 =(uc | firstByteMark[len]);}ptr2+=len;break;default: *ptr2++=*ptr; break;}ptr++;}}*ptr2=0;if (*ptr=='\"') ptr++;item->valuestring=out;item->type=cJSON_String;return ptr; }

?

?

cJSON打印

打印的過程類似于鏈表的遍歷,它的流程圖如下:

/* 將cJSON項(xiàng)/實(shí)體/結(jié)構(gòu)呈現(xiàn)為文本。 */ char *cJSON_Print(cJSON *item) {return print_value(item,0,1,0);} char *cJSON_PrintUnformatted(cJSON *item) {return print_value(item,0,0,0);} //cjson打印就是從根對象的結(jié)構(gòu)體開始遍歷,得到每個(gè)item結(jié)點(diǎn)的名稱和數(shù)據(jù),并經(jīng)過處理成特定的cjson字符串的輸出形式。 //cJSON_Print(root)和cJSON_PrintUnformatted(root)函數(shù)都是打印成json字符串的函數(shù),兩者的區(qū)別就是 //cJSON_PrintUnformatted(root)處理過的字符串里沒有\(zhòng)t\n這類格式

我用官方給實(shí)例代碼運(yùn)行程序時(shí),因?yàn)闆]有涉及到printbuffer(即令該值為0),所以程序走的都是else內(nèi)的操作。

/* 為文本呈現(xiàn)一個(gè)值。 */ static char *print_value(cJSON *item,int depth,int fmt,printbuffer *p) { // fmt傳入時(shí)值為1char *out=0;if (!item) return 0;if (p){switch ((item->type)&255){case cJSON_NULL: {out=ensure(p,5); if (out) strcpy(out,"null"); break;}case cJSON_False: {out=ensure(p,6); if (out) strcpy(out,"false"); break;}case cJSON_True: {out=ensure(p,5); if (out) strcpy(out,"true"); break;}case cJSON_Number: out=print_number(item,p);break;case cJSON_String: out=print_string(item,p);break;case cJSON_Array: out=print_array(item,depth,fmt,p);break;case cJSON_Object: out=print_object(item,depth,fmt,p);break;}}else{switch ((item->type)&255){case cJSON_NULL: out=cJSON_strdup("null"); break;case cJSON_False: out=cJSON_strdup("false");break;case cJSON_True: out=cJSON_strdup("true"); break;case cJSON_Number: out=print_number(item,0);break;case cJSON_String: out=print_string(item,0);break;case cJSON_Array: out=print_array(item,depth,fmt,0);break;case cJSON_Object: out=print_object(item,depth,fmt,0);break;}}return out; }

?

該函數(shù),開始使用numentries記錄對象的數(shù)量。因?yàn)樯厦嫣岬搅藀rintbuffer *p = 0,所以在組成輸出格式的時(shí)候,分配2個(gè)指針數(shù)組存儲對象里的鍵和值。最后通過對兩個(gè)指針數(shù)組的內(nèi)容的拼接,將數(shù)據(jù)組成輸出的格式。可以看到代碼末端" { " 和 " } "之間的代碼都是拼接操作。這部分的代碼,要先將else內(nèi)的邏輯流程看懂。

/* 將對象呈現(xiàn)為文本。 */ static char *print_object(cJSON *item,int depth,int fmt,printbuffer *p) {char **entries=0,**names=0;char *out=0,*ptr,*ret,*str;int len=7,i=0,j;cJSON *child=item->child;int numentries=0,fail=0;size_t tmplen=0;/* numentries記錄對象的數(shù)量。 */while (child) numentries++,child=child->next;/* 顯式處理空對象情況 */if (!numentries){if (p) out=ensure(p,fmt?depth+4:3);else out=(char*)cJSON_malloc(fmt?depth+4:3);if (!out) return 0;ptr=out;*ptr++='{';if (fmt) {*ptr++='\n';for (i=0;i<depth-1;i++) *ptr++='\t';}*ptr++='}';*ptr++=0;return out;}if (p){/* 組成的輸出: */i=p->offset;len=fmt?2:1; ptr=ensure(p,len+1); if (!ptr) return 0;*ptr++='{'; if (fmt) *ptr++='\n'; *ptr=0; p->offset+=len;child=item->child;depth++;while (child){if (fmt){ptr=ensure(p,depth); if (!ptr) return 0;for (j=0;j<depth;j++) *ptr++='\t';p->offset+=depth;}print_string_ptr(child->string,p);p->offset=update(p);len=fmt?2:1;ptr=ensure(p,len); if (!ptr) return 0;*ptr++=':';if (fmt) *ptr++='\t';p->offset+=len;print_value(child,depth,fmt,p);p->offset=update(p);len=(fmt?1:0)+(child->next?1:0);ptr=ensure(p,len+1); if (!ptr) return 0;if (child->next) *ptr++=',';if (fmt) *ptr++='\n';*ptr=0;p->offset+=len;child=child->next;}ptr=ensure(p,fmt?(depth+1):2); if (!ptr) return 0;if (fmt) for (i=0;i<depth-1;i++) *ptr++='\t';*ptr++='}';*ptr=0;out=(p->buffer)+i;}else{//分配2個(gè)指針數(shù)組存儲對象里的鍵和值。entries=(char**)cJSON_malloc(numentries*sizeof(char*));if (!entries) return 0;names=(char**)cJSON_malloc(numentries*sizeof(char*));if (!names) {cJSON_free(entries);return 0;}memset(entries,0,sizeof(char*)*numentries);memset(names,0,sizeof(char*)*numentries);/* 收集所有結(jié)果到我們的數(shù)組: */child=item->child;depth++;if (fmt) len+=depth;while (child){names[i]=str=print_string_ptr(child->string,0);entries[i++]=ret=print_value(child,depth,fmt,0);if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1;child=child->next;}/* 嘗試分配輸出字符串 */if (!fail) out=(char*)cJSON_malloc(len);if (!out) fail=1;/* 處理失敗 */if (fail){for (i=0;i<numentries;i++) {if (names[i]) cJSON_free(names[i]);if (entries[i]) cJSON_free(entries[i]);}cJSON_free(names);cJSON_free(entries);return 0;}/* 組成的輸出: */*out='{';ptr=out+1;if (fmt)*ptr++='\n';*ptr=0;for (i=0;i<numentries;i++){if (fmt) for (j=0;j<depth;j++) *ptr++='\t';tmplen=strlen(names[i]);memcpy(ptr,names[i],tmplen);ptr+=tmplen;*ptr++=':';if (fmt) *ptr++='\t';strcpy(ptr,entries[i]);ptr+=strlen(entries[i]);if (i!=numentries-1) *ptr++=',';if (fmt) *ptr++='\n';*ptr=0;cJSON_free(names[i]);cJSON_free(entries[i]);}cJSON_free(names);cJSON_free(entries);if (fmt) for (i=0;i<depth-1;i++) *ptr++='\t';*ptr++='}';*ptr++=0;}return out; }

?

該函數(shù),開始使用numentries記錄數(shù)組中元素的數(shù)量。這里的printbuffer *p = 0,在組成輸出格式的時(shí)候,分配一個(gè)指針數(shù)組存儲數(shù)組里的每一個(gè)元素的打印結(jié)果。這里多的一個(gè)操作是,數(shù)組內(nèi)容可能是對象,所以要調(diào)用print_value()打印相應(yīng)內(nèi)容。可以在源代碼中看到ret=print_value(child,depth+1,fmt,0);??。獲取數(shù)據(jù)后,接下來組成數(shù)組的輸出形式。代碼末端" [?" 和 " ]?"之間的代碼都是拼接操作。

/* 將數(shù)組呈現(xiàn)為文本 */ static char *print_array(cJSON *item,int depth,int fmt,printbuffer *p) {char **entries;char *out=0,*ptr,*ret;int len=5;cJSON *child=item->child;int numentries=0,i=0,fail=0;size_t tmplen=0;/* numentries記錄數(shù)組中有多少元素 */while (child) numentries++,child=child->next;/* 處理numentries == 0 */if (!numentries){if (p) out=ensure(p,3);else out=(char*)cJSON_malloc(3);if (out) strcpy(out,"[]");return out;}if (p){/* 組合輸出數(shù)組。*/i=p->offset;ptr=ensure(p,1);if (!ptr) return 0; *ptr='['; p->offset++;child=item->child;while (child && !fail){print_value(child,depth+1,fmt,p);p->offset=update(p);if (child->next) {len=fmt?2:1;ptr=ensure(p,len+1);if (!ptr) return 0;*ptr++=',';if(fmt)*ptr++=' ';*ptr=0;p->offset+=len;}child=child->next;}ptr=ensure(p,2);if (!ptr) return 0; *ptr++=']';*ptr=0;out=(p->buffer)+i;}else{/* 分配一個(gè)指針數(shù)組存儲數(shù)組里的每一個(gè)元素的打印結(jié)果。 */entries=(char**)cJSON_malloc(numentries*sizeof(char*));if (!entries) return 0;memset(entries,0,numentries*sizeof(char*));/* 檢索所有結(jié)果: */child=item->child;while (child && !fail){ret=print_value(child,depth+1,fmt,0); //數(shù)組內(nèi)容可能是對象,所以要調(diào)用print_value打印相應(yīng)內(nèi)容。返回值為char*entries[i++]=ret;if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1;child=child->next;}/* 如果沒有失敗,嘗試malloc輸出字符串 */if (!fail) out=(char*)cJSON_malloc(len);/* 如果失敗了,我們就失敗了。 */if (!out) fail=1;/* 處理失敗。 */if (fail){for (i=0;i<numentries;i++) if (entries[i]) cJSON_free(entries[i]);cJSON_free(entries);return 0;}/* 數(shù)據(jù)已經(jīng)獲取了,接下來組成數(shù)組的輸出形式。*/*out='[';ptr=out+1;*ptr=0;for (i=0;i<numentries;i++){tmplen=strlen(entries[i]);memcpy(ptr,entries[i],tmplen);ptr+=tmplen;if (i!=numentries-1) {*ptr++=',';if(fmt)*ptr++=' ';*ptr=0;}cJSON_free(entries[i]);}cJSON_free(entries);*ptr++=']';*ptr++=0;}return out; }

?

在看這部分代碼時(shí),我一直在糾結(jié)ensure(),最后發(fā)現(xiàn)它是一個(gè)協(xié)助printbuffer分配內(nèi)存的函數(shù),而代碼中的printbuffer *p = 0。所以只需要跳過相應(yīng)的代碼就可以理解它的邏輯流程了。這里遇到不懂的是DBL_EPSILON和sprintf(str,"%d",item->valueint);,這兩個(gè)問題的解釋在注釋中。

/* 將給定項(xiàng)中的數(shù)字漂亮地呈現(xiàn)為字符串。 */ static char *print_number(cJSON *item,printbuffer *p) {char *str=0;double d=item->valuedouble;if (d==0){if (p) str=ensure(p,2);else str=(char*)cJSON_malloc(2); /* 0的特殊情況。 */if (str) strcpy(str,"0");}else if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN){ //fabs 作用是求浮點(diǎn)數(shù)的絕對值。 double fabs(double x );//DBL_EPSILON和 FLT_EPSILON主要用于單精度和雙精度的比較當(dāng)中:if (p) str=ensure(p,21);else str=(char*)cJSON_malloc(21); /* 2^64+1 可以用21個(gè)字符表示。 */if (str) sprintf(str,"%d",item->valueint); //函數(shù)功能:格式化字符串,將格式化的數(shù)據(jù)寫入字符串中。//函數(shù)原型:int sprintf(char *buffer, const char *format, [argument]…)//格式化數(shù)字字符串:在這點(diǎn)上sprintf和printf的用法一樣,只是打印到的位置不同而已,前者打印給buffer字符串//后者打印給標(biāo)準(zhǔn)輸出,所以sprintf也可以用來將整型轉(zhuǎn)化為字符串//比itoa效率高且簡便,比如:sprintf(buffer, "%d", 123456);執(zhí)行后buffer即指向字符串"123456"。}else{if (p) str=ensure(p,64);else str=(char*)cJSON_malloc(64); /* 這是一個(gè)很好的權(quán)衡。 */if (str){if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60)sprintf(str,"%.0f",d);else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d);else sprintf(str,"%f",d);}}return str; }

?

這里主要看print_string_ptr()中while里的內(nèi)容。

/* 引用print_string_ptr()函數(shù)。 */ static char *print_string(cJSON *item,printbuffer *p) {return print_string_ptr(item->valuestring,p);} /* 將提供的cstring呈現(xiàn)給一個(gè)可以打印的轉(zhuǎn)義版本。 */ static char *print_string_ptr(const char *str,printbuffer *p) {const char *ptr;char *ptr2,*out;int len=0,flag=0;unsigned char token;for (ptr=str;*ptr;ptr++) flag|=((*ptr>0 && *ptr<32)||(*ptr=='\"')||(*ptr=='\\'))?1:0;if (!flag) //對字符串中不含'\','/',空格等字符的字符處理{len=ptr-str;if (p) out=ensure(p,len+3);else out=(char*)cJSON_malloc(len+3);if (!out) return 0;ptr2=out;*ptr2++='\"';strcpy(ptr2,str);ptr2[len]='\"';ptr2[len+1]=0;return out;}if (!str){if (p) out=ensure(p,3);else out=(char*)cJSON_malloc(3);if (!out) return 0;strcpy(out,"\"\"");return out;}ptr=str;while ((token=*ptr) && ++len) {if (strchr("\"\\\b\f\n\r\t",token)) len++; else if (token<32) len+=5;ptr++;}if (p) out=ensure(p,len+3);else out=(char*)cJSON_malloc(len+3);if (!out) return 0;ptr2=out;ptr=str;*ptr2++='\"';while (*ptr){if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') *ptr2++=*ptr++;else{*ptr2++='\\';switch (token=*ptr++){case '\\': *ptr2++='\\'; break;case '\"': *ptr2++='\"'; break;case '\b': *ptr2++='b'; break;case '\f': *ptr2++='f'; break;case '\n': *ptr2++='n'; break;case '\r': *ptr2++='r'; break;case '\t': *ptr2++='t'; break;default: sprintf(ptr2,"u%04x",token);ptr2+=5; break; /* escape and print */}}}*ptr2++='\"';*ptr2++=0;return out; }

?

?

其他函數(shù)

聲明函數(shù)指針,方便分配和釋放空間。以下代碼就不細(xì)講了,注釋中有相應(yīng)的解釋。

static void *(*cJSON_malloc)(size_t sz) = malloc; //聲明函數(shù)指針,例如:double (*pf)(int); static void (*cJSON_free)(void *ptr) = free; //這兩個(gè)函數(shù)返回值都是void * /* 該結(jié)構(gòu)體提供了分配和釋放空間的函數(shù)指針 */ typedef struct cJSON_Hooks {void *(*malloc_fn)(size_t sz);void (*free_fn)(void *ptr); } cJSON_Hooks;void cJSON_InitHooks(cJSON_Hooks* hooks) {if (!hooks) { /* 若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; }

?

cJSON_strcasecmp()

static int cJSON_strcasecmp(const char *s1,const char *s2) //功能和strcasecmp一樣,忽略大小寫比較字符串。 {if (!s1) return (s1==s2)?0:1; //s1若為空,根據(jù)s1和s2是否相等返回0或者1。if (!s2) return 1; //s2若為空,返回1。for(; tolower(*s1) == tolower(*s2); ++s1, ++s2) //tolower的功能是把字母字符轉(zhuǎn)換成小寫,非字母字符不做出處理。if(*s1 == 0) //函數(shù)說明:若參數(shù) c 為大寫字母則將該對應(yīng)的小寫字母返回。return 0; //返回值:返回轉(zhuǎn)換后的小寫字母,若不須轉(zhuǎn)換則將參數(shù)c 值返回。return tolower(*(const unsigned char *)s1) - tolower(*(const unsigned char *)s2); }

?

cJSON_strdup()

static char* cJSON_strdup(const char* str) //cJSON的字符串拷貝函數(shù) { //strdup()函數(shù)是c語言中常用的一種字符串拷貝庫函數(shù),一般和free()函數(shù)成對出現(xiàn)。size_t len; //strdup()在內(nèi)部調(diào)用了malloc()為變量分配內(nèi)存,不需要使用返回的字符串時(shí)char* copy; //需要用free()釋放相應(yīng)的內(nèi)存空間,否則會造成內(nèi)存泄漏。len = strlen(str) + 1;if (!(copy = (char*)cJSON_malloc(len))) return 0;memcpy(copy,str,len); //memcpy指的是C和C++使用的內(nèi)存拷貝函數(shù)return copy; //函數(shù)原型為void *memcpy(void *destin, void *source, unsigned n); } //函數(shù)的功能是從源內(nèi)存地址的起始位置開始拷貝若干個(gè)字節(jié)到目標(biāo)內(nèi)存地址中。

?

cJSON_Delete()

/* 刪除cJSON結(jié)構(gòu)體 */ void cJSON_Delete(cJSON *c) {cJSON *next;while (c){next=c->next;//遞歸刪除結(jié)點(diǎn)if (!(c->type&cJSON_IsReference) && c->child) cJSON_Delete(c->child);if (!(c->type&cJSON_IsReference) && c->valuestring) cJSON_free(c->valuestring);if (!(c->type&cJSON_StringIsConst) && c->string) cJSON_free(c->string);cJSON_free(c);c=next;} }

?

ensure()

/* 例如x = 6或8,則返回8。 x = 12或13,則返回16。 總結(jié):返回 >= x的最小2的n次方。 */ static int pow2gt (int x) { --x; x|=x>>1; x|=x>>2; x|=x>>4; x|=x>>8; x|=x>>16; return x+1; }typedef struct {char *buffer; int length; int offset; } printbuffer; //printbuffer的數(shù)據(jù)結(jié)構(gòu):地址、長度和偏移量。static char* ensure(printbuffer *p,int needed) //ensure 函數(shù)是一個(gè)協(xié)助printbuffer分配內(nèi)存的一個(gè)函數(shù) //p->length表示當(dāng)前字符串的長度 {char *newbuffer;int newsize;if (!p || !p->buffer) return 0; //p空或p->buffer空,則返回0。needed+=p->offset; //需要額外分配的內(nèi)存,也就是偏移量if (needed<=p->length) return p->buffer+p->offset;newsize=pow2gt(needed); //pow2gt返回newsize所需要的空間。newbuffer=(char*)cJSON_malloc(newsize); //malloc出新內(nèi)存 放buffer里面的內(nèi)容。if (!newbuffer) {cJSON_free(p->buffer);p->length=0,p->buffer=0;return 0;}if (newbuffer) memcpy(newbuffer,p->buffer,p->length); //分配成功就將原先的p的內(nèi)容復(fù)制過去。cJSON_free(p->buffer);p->length=newsize;p->buffer=newbuffer;return newbuffer+p->offset; }

?

創(chuàng)建數(shù)組的一些列函數(shù)

/* 用于數(shù)組列表處理的實(shí)用工具。 */ // prev->next指向item,item->prev指向prev。 static void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;}/* 創(chuàng)建數(shù)組: */ cJSON *cJSON_CreateIntArray(const int *numbers,int count) { int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i) //若i為0。a->child=n;else suffix_object(p,n); // p->next指向n,n->prev指向p。p=n;}return a; } cJSON *cJSON_CreateFloatArray(const float *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;} cJSON *cJSON_CreateDoubleArray(const double *numbers,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;} cJSON *cJSON_CreateStringArray(const char **strings,int count) {int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && i<count;i++){n=cJSON_CreateString(strings[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}

?

添加項(xiàng)到數(shù)組/對象中

/* 用于數(shù)組列表處理的實(shí)用工具。 */ // prev->next指向item,item->prev指向prev。 static void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;}/* 將項(xiàng)目添加到數(shù)組/對象中。 */ void cJSON_AddItemToArray(cJSON *array, cJSON *item) {cJSON *c=array->child;if (!item) return; if (!c) {array->child=item;} else {while (c && c->next) c=c->next; suffix_object(c,item); //c->next指向item,item->prev指向c。} }void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (item->string) cJSON_free(item->string);item->string=cJSON_strdup(string);cJSON_AddItemToArray(object,item);} void cJSON_AddItemToObjectCS(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (!(item->type&cJSON_StringIsConst) && item->string) cJSON_free(item->string);item->string=(char*)string;item->type|=cJSON_StringIsConst;cJSON_AddItemToArray(object,item);} void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) {cJSON_AddItemToArray(array,create_reference(item));} void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item) {cJSON_AddItemToObject(object,string,create_reference(item));}

?

總結(jié)

以上是生活随笔為你收集整理的cJSON源码及解析流程详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

中文亚洲成a人片在线观看 | 免费看男女做好爽好硬视频 | 精品人妻中文字幕有码在线 | 成熟女人特级毛片www免费 | 亚洲国产精品久久久久久 | 色一情一乱一伦一区二区三欧美 | 国产深夜福利视频在线 | 成人性做爰aaa片免费看 | 欧美日韩综合一区二区三区 | 中文字幕无码日韩专区 | 成人动漫在线观看 | 国产乱人伦偷精品视频 | 中文字幕日韩精品一区二区三区 | 成年女人永久免费看片 | 天海翼激烈高潮到腰振不止 | 鲁大师影院在线观看 | 亚洲 日韩 欧美 成人 在线观看 | 久久久久se色偷偷亚洲精品av | 国产精品18久久久久久麻辣 | 无码精品人妻一区二区三区av | 图片区 小说区 区 亚洲五月 | 国产超级va在线观看视频 | 人人妻人人藻人人爽欧美一区 | 亚洲午夜福利在线观看 | 国产精品免费大片 | 夜夜高潮次次欢爽av女 | 亚洲最大成人网站 | 国产精品对白交换视频 | 国产精品成人av在线观看 | 欧美xxxx黑人又粗又长 | 亚洲精品一区二区三区四区五区 | 日日天干夜夜狠狠爱 | 欧美喷潮久久久xxxxx | 99re在线播放 | 免费无码午夜福利片69 | 午夜丰满少妇性开放视频 | 男人的天堂av网站 | 综合人妻久久一区二区精品 | 欧美熟妇另类久久久久久多毛 | 国产亲子乱弄免费视频 | 亚洲中文字幕无码一久久区 | 九九综合va免费看 | 亚洲欧美国产精品专区久久 | 最近中文2019字幕第二页 | 色爱情人网站 | 欧美国产日产一区二区 | 青青久在线视频免费观看 | 亚洲s码欧洲m码国产av | 日韩人妻无码一区二区三区久久99 | 欧美老熟妇乱xxxxx | 国产乱人无码伦av在线a | 牛和人交xxxx欧美 | 国产精品人人爽人人做我的可爱 | 国产精品福利视频导航 | 久久久久亚洲精品男人的天堂 | 内射后入在线观看一区 | 亚洲中文字幕av在天堂 | 亚洲欧美国产精品久久 | 色欲av亚洲一区无码少妇 | 免费网站看v片在线18禁无码 | 国产人妻精品一区二区三区不卡 | 国内少妇偷人精品视频 | 理论片87福利理论电影 | 免费无码肉片在线观看 | 国产办公室秘书无码精品99 | 欧美xxxx黑人又粗又长 | 牛和人交xxxx欧美 | 久久97精品久久久久久久不卡 | 日本一区二区三区免费播放 | 人妻aⅴ无码一区二区三区 | 亚洲无人区午夜福利码高清完整版 | 国产精品亚洲五月天高清 | 精品一二三区久久aaa片 | 久久久精品456亚洲影院 | 中文精品无码中文字幕无码专区 | 国产人妻人伦精品1国产丝袜 | 国产熟妇另类久久久久 | 亚洲精品一区二区三区大桥未久 | 妺妺窝人体色www婷婷 | 亚洲色无码一区二区三区 | 欧美老妇交乱视频在线观看 | 日本一区二区三区免费高清 | 99麻豆久久久国产精品免费 | 无码精品人妻一区二区三区av | 亚洲色www成人永久网址 | 国产97人人超碰caoprom | 国产情侣作爱视频免费观看 | 97精品国产97久久久久久免费 | 麻豆果冻传媒2021精品传媒一区下载 | 国产深夜福利视频在线 | 成熟女人特级毛片www免费 | 国产在线无码精品电影网 | 在线亚洲高清揄拍自拍一品区 | 玩弄人妻少妇500系列视频 | 国产亚洲人成a在线v网站 | 亚洲国产一区二区三区在线观看 | 亚洲欧美色中文字幕在线 | 国产熟妇高潮叫床视频播放 | 国内精品人妻无码久久久影院蜜桃 | 午夜精品一区二区三区在线观看 | 2020久久超碰国产精品最新 | 97人妻精品一区二区三区 | 亚洲天堂2017无码 | 国产精品内射视频免费 | 久久人人爽人人人人片 | 亚洲精品国产精品乱码视色 | 日韩亚洲欧美中文高清在线 | 亚洲日韩av一区二区三区四区 | 国产在线精品一区二区高清不卡 | 久热国产vs视频在线观看 | 午夜理论片yy44880影院 | 亚洲精品一区二区三区在线 | 国产小呦泬泬99精品 | 国产午夜亚洲精品不卡 | 亚洲精品国产精品乱码不卡 | 亚洲精品综合五月久久小说 | 国产av久久久久精东av | 久青草影院在线观看国产 | 国产精品丝袜黑色高跟鞋 | 中文久久乱码一区二区 | 国产精品久久福利网站 | √天堂中文官网8在线 | 精品欧美一区二区三区久久久 | 国产精品va在线播放 | 中文字幕无码日韩欧毛 | 成熟女人特级毛片www免费 | 亚洲经典千人经典日产 | 在线播放亚洲第一字幕 | 欧美丰满熟妇xxxx性ppx人交 | 日本免费一区二区三区最新 | 精品久久久无码中文字幕 | 色综合久久网 | 国産精品久久久久久久 | 麻豆av传媒蜜桃天美传媒 | 亚洲精品无码人妻无码 | 日本一本二本三区免费 | 乱中年女人伦av三区 | 亚洲精品久久久久久久久久久 | 日本一区二区三区免费播放 | 亚拍精品一区二区三区探花 | 人人妻人人澡人人爽欧美一区 | 老熟妇仑乱视频一区二区 | 女人高潮内射99精品 | 午夜男女很黄的视频 | 久久亚洲中文字幕精品一区 | 久久亚洲a片com人成 | 国产精品高潮呻吟av久久4虎 | 中文无码成人免费视频在线观看 | 熟妇人妻无码xxx视频 | 亚洲天堂2017无码 | 女人和拘做爰正片视频 | 中文字幕无码日韩专区 | 国产美女极度色诱视频www | av无码久久久久不卡免费网站 | 亚洲a无码综合a国产av中文 | 亚洲乱码国产乱码精品精 | 日本爽爽爽爽爽爽在线观看免 | 亚洲一区二区三区 | 中文字幕亚洲情99在线 | 久9re热视频这里只有精品 | 少妇性l交大片 | 大地资源中文第3页 | 午夜精品久久久内射近拍高清 | 国内综合精品午夜久久资源 | 性做久久久久久久免费看 | 亚洲人亚洲人成电影网站色 | 久久久久亚洲精品中文字幕 | 亚洲中文字幕在线无码一区二区 | 又大又黄又粗又爽的免费视频 | 国内少妇偷人精品视频免费 | 任你躁国产自任一区二区三区 | 婷婷丁香六月激情综合啪 | 老熟妇乱子伦牲交视频 | 久久国产精品偷任你爽任你 | 中文字幕人妻无码一夲道 | 精品偷自拍另类在线观看 | 日韩少妇内射免费播放 | 蜜臀av无码人妻精品 | 内射白嫩少妇超碰 | 300部国产真实乱 | 国产精品久免费的黄网站 | 亚洲成av人影院在线观看 | 中文字幕无码免费久久99 | 小sao货水好多真紧h无码视频 | 日韩av无码一区二区三区不卡 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲中文字幕无码中字 | 色噜噜亚洲男人的天堂 | 小鲜肉自慰网站xnxx | 奇米影视7777久久精品人人爽 | 中国女人内谢69xxxxxa片 | 久久国产自偷自偷免费一区调 | 欧美日韩精品 | 精品熟女少妇av免费观看 | 99久久人妻精品免费一区 | 三级4级全黄60分钟 | 色一情一乱一伦一区二区三欧美 | 乱码午夜-极国产极内射 | 97夜夜澡人人双人人人喊 | 国产成人无码a区在线观看视频app | 亚洲精品一区三区三区在线观看 | 国语自产偷拍精品视频偷 | 国产精品igao视频网 | 少妇性荡欲午夜性开放视频剧场 | 国产人成高清在线视频99最全资源 | 亚洲色欲久久久综合网东京热 | a在线亚洲男人的天堂 | 亚洲大尺度无码无码专区 | 国产精品久久久久久亚洲影视内衣 | 日韩av无码一区二区三区 | 中文字幕日产无线码一区 | 免费观看的无遮挡av | 亚洲色欲久久久综合网东京热 | 永久免费观看美女裸体的网站 | 少妇无码av无码专区在线观看 | 1000部啪啪未满十八勿入下载 | 国产成人无码av片在线观看不卡 | 永久免费观看国产裸体美女 | 在线a亚洲视频播放在线观看 | 亚洲精品国产第一综合99久久 | 久久午夜无码鲁丝片秋霞 | 日本精品人妻无码免费大全 | 狠狠躁日日躁夜夜躁2020 | 久久精品中文闷骚内射 | 大色综合色综合网站 | 人人超人人超碰超国产 | √天堂资源地址中文在线 | 亚洲の无码国产の无码影院 | 亚洲精品成a人在线观看 | 疯狂三人交性欧美 | 国产超碰人人爽人人做人人添 | 国产乱人无码伦av在线a | 欧美日韩在线亚洲综合国产人 | 国产亚洲美女精品久久久2020 | 成人欧美一区二区三区黑人免费 | 性欧美牲交在线视频 | 综合网日日天干夜夜久久 | 亚洲毛片av日韩av无码 | 国产一精品一av一免费 | 狠狠色色综合网站 | 任你躁在线精品免费 | 亚洲人成影院在线观看 | 亚洲国产成人a精品不卡在线 | 丝袜 中出 制服 人妻 美腿 | 欧美日本免费一区二区三区 | 亚洲精品国产精品乱码不卡 | 正在播放老肥熟妇露脸 | 欧美 丝袜 自拍 制服 另类 | 国产成人亚洲综合无码 | 国产在线aaa片一区二区99 | 亚洲国产精品美女久久久久 | 国产av一区二区三区最新精品 | 免费中文字幕日韩欧美 | 最近的中文字幕在线看视频 | 在线成人www免费观看视频 | 少妇愉情理伦片bd | 久久www免费人成人片 | 97久久国产亚洲精品超碰热 | 99久久婷婷国产综合精品青草免费 | 中国大陆精品视频xxxx | 久久久久免费精品国产 | 天堂无码人妻精品一区二区三区 | 欧美高清在线精品一区 | 国产农村妇女高潮大叫 | 久久精品成人欧美大片 | 亚洲の无码国产の无码影院 | 欧洲熟妇色 欧美 | 亚洲精品成a人在线观看 | 少妇久久久久久人妻无码 | 亚洲狠狠婷婷综合久久 | 麻豆国产丝袜白领秘书在线观看 | 精品国偷自产在线视频 | 131美女爱做视频 | 一本久久a久久精品vr综合 | 狠狠色色综合网站 | 亚洲一区二区三区偷拍女厕 | 国产av久久久久精东av | 日日碰狠狠躁久久躁蜜桃 | 久久亚洲精品中文字幕无男同 | 久久久久久国产精品无码下载 | 男女猛烈xx00免费视频试看 | 亚洲欧美日韩国产精品一区二区 | 亚洲国产高清在线观看视频 | 97精品人妻一区二区三区香蕉 | 小sao货水好多真紧h无码视频 | 无码人妻黑人中文字幕 | 日本爽爽爽爽爽爽在线观看免 | 熟妇人妻无码xxx视频 | 精品国精品国产自在久国产87 | 国产97色在线 | 免 | 日日夜夜撸啊撸 | 免费看少妇作爱视频 | 亚洲中文字幕成人无码 | 大地资源网第二页免费观看 | 色综合久久久久综合一本到桃花网 | 欧美 丝袜 自拍 制服 另类 | 一区二区三区乱码在线 | 欧洲 | 国产后入清纯学生妹 | 日韩成人一区二区三区在线观看 | 18无码粉嫩小泬无套在线观看 | 国产免费观看黄av片 | 无码人妻精品一区二区三区不卡 | 国产艳妇av在线观看果冻传媒 | 久久婷婷五月综合色国产香蕉 | 久久亚洲国产成人精品性色 | 少妇的肉体aa片免费 | 国产做国产爱免费视频 | 国产深夜福利视频在线 | 成人亚洲精品久久久久软件 | 成人影院yy111111在线观看 | 日本成熟视频免费视频 | 一本色道婷婷久久欧美 | 成人无码视频在线观看网站 | 久久综合香蕉国产蜜臀av | 欧美熟妇另类久久久久久多毛 | 国产高潮视频在线观看 | 国产精品国产自线拍免费软件 | 国产免费观看黄av片 | 任你躁国产自任一区二区三区 | 亚洲国产精品成人久久蜜臀 | √天堂中文官网8在线 | 日韩精品久久久肉伦网站 | 精品一区二区三区无码免费视频 | 小鲜肉自慰网站xnxx | 人人妻人人澡人人爽人人精品 | 九九热爱视频精品 | 精品一区二区不卡无码av | 扒开双腿吃奶呻吟做受视频 | 在线成人www免费观看视频 | 天天躁夜夜躁狠狠是什么心态 | 国产精品亚洲一区二区三区喷水 | 精品熟女少妇av免费观看 | 亚洲欧美综合区丁香五月小说 | 成熟妇人a片免费看网站 | 久久久久久九九精品久 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 67194成是人免费无码 | 亚洲日本va午夜在线电影 | 亚洲精品国偷拍自产在线麻豆 | 99精品无人区乱码1区2区3区 | 亚洲男女内射在线播放 | 色一情一乱一伦一区二区三欧美 | 2019午夜福利不卡片在线 | 午夜福利一区二区三区在线观看 | 国产精品国产三级国产专播 | 一个人看的视频www在线 | 日产精品99久久久久久 | 最新国产麻豆aⅴ精品无码 | 久久综合给久久狠狠97色 | 亚洲国产欧美在线成人 | 性欧美牲交xxxxx视频 | 福利一区二区三区视频在线观看 | 一本加勒比波多野结衣 | 亚洲国产精品无码一区二区三区 | 免费看男女做好爽好硬视频 | 老太婆性杂交欧美肥老太 | av在线亚洲欧洲日产一区二区 | 亚洲男人av天堂午夜在 | 国产在线一区二区三区四区五区 | 国产莉萝无码av在线播放 | 久久人人97超碰a片精品 | 精品午夜福利在线观看 | 香蕉久久久久久av成人 | 99久久99久久免费精品蜜桃 | 久久综合久久自在自线精品自 | 亚洲熟妇自偷自拍另类 | 漂亮人妻洗澡被公强 日日躁 | 国产成人综合色在线观看网站 | 国语自产偷拍精品视频偷 | 啦啦啦www在线观看免费视频 | 波多野42部无码喷潮在线 | 欧美日本免费一区二区三区 | 国产精品美女久久久 | 国产精品沙发午睡系列 | 高中生自慰www网站 | 激情国产av做激情国产爱 | 国产精品自产拍在线观看 | 国产精品永久免费视频 | 人人妻人人澡人人爽欧美一区 | 综合网日日天干夜夜久久 | 色综合久久网 | 中文字幕无线码免费人妻 | 亚洲成av人片在线观看无码不卡 | 国产av久久久久精东av | 久久久成人毛片无码 | 高中生自慰www网站 | 亚洲精品一区二区三区大桥未久 | av无码电影一区二区三区 | 亚洲精品一区三区三区在线观看 | 奇米影视7777久久精品 | 初尝人妻少妇中文字幕 | 国产亚洲美女精品久久久2020 | 四十如虎的丰满熟妇啪啪 | 亚洲 欧美 激情 小说 另类 | 国产偷抇久久精品a片69 | 日韩av无码中文无码电影 | 精品国产乱码久久久久乱码 | 西西人体www44rt大胆高清 | 亚洲区欧美区综合区自拍区 | 熟妇女人妻丰满少妇中文字幕 | 国产黄在线观看免费观看不卡 | 高清不卡一区二区三区 | 97久久国产亚洲精品超碰热 | 55夜色66夜色国产精品视频 | yw尤物av无码国产在线观看 | 亚洲精品一区二区三区大桥未久 | 亚洲熟妇色xxxxx欧美老妇y | 内射后入在线观看一区 | 欧美人妻一区二区三区 | 亚洲精品中文字幕 | 欧美熟妇另类久久久久久多毛 | 亚洲国产精品一区二区美利坚 | 三级4级全黄60分钟 | 日本熟妇人妻xxxxx人hd | 性色欲网站人妻丰满中文久久不卡 | 国产成人综合美国十次 | 88国产精品欧美一区二区三区 | 亚洲成a人片在线观看无码3d | 又大又硬又爽免费视频 | 精品厕所偷拍各类美女tp嘘嘘 | 午夜精品一区二区三区的区别 | 久久综合色之久久综合 | 欧洲vodafone精品性 | 最近的中文字幕在线看视频 | 国产婷婷色一区二区三区在线 | 夜夜躁日日躁狠狠久久av | 国产97人人超碰caoprom | 国内少妇偷人精品视频免费 | 强开小婷嫩苞又嫩又紧视频 | 色综合久久久无码网中文 | 日本一卡2卡3卡四卡精品网站 | 精品水蜜桃久久久久久久 | 久久久久免费看成人影片 | 免费国产黄网站在线观看 | 欧美丰满熟妇xxxx | 成人综合网亚洲伊人 | 无码人妻出轨黑人中文字幕 | 色 综合 欧美 亚洲 国产 | 国产明星裸体无码xxxx视频 | 偷窥日本少妇撒尿chinese | 亚洲日韩精品欧美一区二区 | 六十路熟妇乱子伦 | 无码国产色欲xxxxx视频 | 久久人人爽人人人人片 | 人人妻人人澡人人爽精品欧美 | 亚洲国产精品无码一区二区三区 | av无码久久久久不卡免费网站 | 97久久超碰中文字幕 | 福利一区二区三区视频在线观看 | 色综合久久久无码网中文 | 久久亚洲中文字幕精品一区 | 在线成人www免费观看视频 | 国产乱子伦视频在线播放 | 300部国产真实乱 | 国产av一区二区精品久久凹凸 | 300部国产真实乱 | 漂亮人妻洗澡被公强 日日躁 | 小泽玛莉亚一区二区视频在线 | 日日摸日日碰夜夜爽av | 亚洲の无码国产の无码影院 | 18黄暴禁片在线观看 | 亚洲色欲色欲天天天www | 牲交欧美兽交欧美 | aⅴ亚洲 日韩 色 图网站 播放 | 午夜性刺激在线视频免费 | 日韩精品a片一区二区三区妖精 | 亚洲毛片av日韩av无码 | 国产另类ts人妖一区二区 | 亚洲人成影院在线无码按摩店 | 麻豆国产97在线 | 欧洲 | 无码人妻丰满熟妇区毛片18 | 亚洲色www成人永久网址 | 九一九色国产 | 国产亚洲精品久久久久久久 | www国产亚洲精品久久久日本 | 真人与拘做受免费视频一 | 无码一区二区三区在线观看 | a片在线免费观看 | 蜜桃视频韩日免费播放 | 九月婷婷人人澡人人添人人爽 | 131美女爱做视频 | 亚洲爆乳大丰满无码专区 | 国产在线精品一区二区高清不卡 | 女人和拘做爰正片视频 | 亚洲日本一区二区三区在线 | 中文无码精品a∨在线观看不卡 | 国产一区二区不卡老阿姨 | 性色欲网站人妻丰满中文久久不卡 | 丝袜足控一区二区三区 | 亚洲精品中文字幕久久久久 | 中文字幕无码av激情不卡 | 十八禁真人啪啪免费网站 | 日本饥渴人妻欲求不满 | 亚洲精品一区二区三区婷婷月 | 亚洲男人av香蕉爽爽爽爽 | 黑人大群体交免费视频 | 中文字幕中文有码在线 | 中文亚洲成a人片在线观看 | 亚洲男人av天堂午夜在 | 色诱久久久久综合网ywww | 人人澡人人透人人爽 | 99麻豆久久久国产精品免费 | 激情人妻另类人妻伦 | 无遮无挡爽爽免费视频 | 婷婷丁香五月天综合东京热 | 亚洲一区二区三区播放 | 六月丁香婷婷色狠狠久久 | 少妇人妻av毛片在线看 | 日本熟妇大屁股人妻 | 最新版天堂资源中文官网 | 国产亚洲精品久久久闺蜜 | 伊在人天堂亚洲香蕉精品区 | 成人av无码一区二区三区 | 国产精品无码一区二区三区不卡 | 久久国产精品偷任你爽任你 | 九月婷婷人人澡人人添人人爽 | 人妻少妇精品无码专区动漫 | 99久久无码一区人妻 | 亚洲乱码国产乱码精品精 | 久久精品女人的天堂av | 午夜丰满少妇性开放视频 | 久久久久99精品成人片 | 少妇无码一区二区二三区 | 台湾无码一区二区 | 国产女主播喷水视频在线观看 | 国内少妇偷人精品视频 | 久久99精品国产麻豆 | 少妇一晚三次一区二区三区 | 夜精品a片一区二区三区无码白浆 | 久久99精品久久久久久动态图 | 伊在人天堂亚洲香蕉精品区 | 国产亚洲欧美日韩亚洲中文色 | 自拍偷自拍亚洲精品10p | 亚洲va欧美va天堂v国产综合 | 国产精品欧美成人 | 国产精品无码成人午夜电影 | 狠狠躁日日躁夜夜躁2020 | 国产国语老龄妇女a片 | 日韩av无码中文无码电影 | 青青青手机频在线观看 | 少妇性l交大片欧洲热妇乱xxx | 久久久精品成人免费观看 | 日日麻批免费40分钟无码 | 中文无码精品a∨在线观看不卡 | 日本在线高清不卡免费播放 | www成人国产高清内射 | 国产av人人夜夜澡人人爽麻豆 | 国产电影无码午夜在线播放 | 亚洲精品欧美二区三区中文字幕 | 国产乱子伦视频在线播放 | 伊人久久婷婷五月综合97色 | 最新版天堂资源中文官网 | 日本xxxx色视频在线观看免费 | 亚洲欧美日韩综合久久久 | 亚洲国产精品一区二区第一页 | 久久亚洲a片com人成 | 少妇高潮喷潮久久久影院 | 国产午夜福利亚洲第一 | 中文字幕人妻丝袜二区 | 国产精品久久久久久无码 | 男女作爱免费网站 | 无码免费一区二区三区 | 日韩欧美中文字幕在线三区 | 国产精品99久久精品爆乳 | 色婷婷av一区二区三区之红樱桃 | 精品久久8x国产免费观看 | 国产婷婷色一区二区三区在线 | 国产激情一区二区三区 | 久久久www成人免费毛片 | 中文字幕色婷婷在线视频 | 东京一本一道一二三区 | 性欧美牲交xxxxx视频 | 午夜无码区在线观看 | 欧美变态另类xxxx | 暴力强奷在线播放无码 | 色欲久久久天天天综合网精品 | 一本久道久久综合婷婷五月 | 色五月丁香五月综合五月 | 强辱丰满人妻hd中文字幕 | 欧美一区二区三区视频在线观看 | 精品欧洲av无码一区二区三区 | 人妻互换免费中文字幕 | 丰满人妻一区二区三区免费视频 | 日韩精品无码免费一区二区三区 | 人人澡人人妻人人爽人人蜜桃 | 国产精品自产拍在线观看 | 无套内射视频囯产 | 大肉大捧一进一出好爽视频 | 亚洲第一无码av无码专区 | 18禁止看的免费污网站 | 人妻体内射精一区二区三四 | 久久国产36精品色熟妇 | 曰本女人与公拘交酡免费视频 | 伊人久久大香线蕉av一区二区 | 伊人久久大香线蕉亚洲 | 免费观看的无遮挡av | 精品日本一区二区三区在线观看 | 欧美高清在线精品一区 | 99精品国产综合久久久久五月天 | 午夜成人1000部免费视频 | 欧美激情内射喷水高潮 | 国产精华av午夜在线观看 | 亚洲日韩av一区二区三区四区 | 高潮毛片无遮挡高清免费 | 亚洲а∨天堂久久精品2021 | 亚洲自偷精品视频自拍 | 麻豆av传媒蜜桃天美传媒 | 国产人成高清在线视频99最全资源 | 中文字幕无码日韩欧毛 | 搡女人真爽免费视频大全 | 亚洲啪av永久无码精品放毛片 | 色一情一乱一伦一视频免费看 | 亚洲综合精品香蕉久久网 | 娇妻被黑人粗大高潮白浆 | 一本大道伊人av久久综合 | 亚洲精品国产第一综合99久久 | 亚洲乱码中文字幕在线 | 999久久久国产精品消防器材 | 精品久久8x国产免费观看 | 久久久久久久女国产乱让韩 | 国产精品二区一区二区aⅴ污介绍 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲aⅴ无码成人网站国产app | 欧美成人高清在线播放 | 国产熟女一区二区三区四区五区 | 国产美女极度色诱视频www | 亚洲男女内射在线播放 | 丰满人妻被黑人猛烈进入 | 亚洲日韩中文字幕在线播放 | 性做久久久久久久久 | 无码帝国www无码专区色综合 | 精品偷拍一区二区三区在线看 | 国产精品va在线观看无码 | 亚洲精品无码人妻无码 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产麻豆精品一区二区三区v视界 | 日日天日日夜日日摸 | 国产在热线精品视频 | 黑人巨大精品欧美黑寡妇 | 国产精品无码成人午夜电影 | 精品偷自拍另类在线观看 | 精品久久久久香蕉网 | 熟妇人妻中文av无码 | 2020最新国产自产精品 | 女人被爽到呻吟gif动态图视看 | 日日碰狠狠躁久久躁蜜桃 | 乱码午夜-极国产极内射 | 国产精品美女久久久久av爽李琼 | 波多野结衣 黑人 | 玩弄中年熟妇正在播放 | 成人性做爰aaa片免费看不忠 | 国产乱人偷精品人妻a片 | 成人性做爰aaa片免费看 | 国产黑色丝袜在线播放 | 日日摸夜夜摸狠狠摸婷婷 | 日韩精品a片一区二区三区妖精 | 日本一本二本三区免费 | 亚洲熟悉妇女xxx妇女av | 久久久无码中文字幕久... | 玩弄少妇高潮ⅹxxxyw | 激情爆乳一区二区三区 | 黑人巨大精品欧美一区二区 | 国产精品久久久午夜夜伦鲁鲁 | 精品久久久久香蕉网 | 国产成人无码av片在线观看不卡 | 97精品人妻一区二区三区香蕉 | 人人爽人人澡人人人妻 | 精品午夜福利在线观看 | 亚洲aⅴ无码成人网站国产app | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲一区二区三区无码久久 | 奇米影视888欧美在线观看 | 福利一区二区三区视频在线观看 | 激情内射日本一区二区三区 | 啦啦啦www在线观看免费视频 | 熟妇激情内射com | 色诱久久久久综合网ywww | 亚洲の无码国产の无码影院 | 98国产精品综合一区二区三区 | 亚洲va中文字幕无码久久不卡 | 日本一卡2卡3卡四卡精品网站 | 伊人色综合久久天天小片 | 久久无码中文字幕免费影院蜜桃 | 国产精品久久久 | 亚洲日韩精品欧美一区二区 | 激情综合激情五月俺也去 | 牲欲强的熟妇农村老妇女 | 亚洲国产欧美国产综合一区 | 牲欲强的熟妇农村老妇女视频 | 久久www免费人成人片 | 无码精品国产va在线观看dvd | 国产精品人妻一区二区三区四 | 国产麻豆精品一区二区三区v视界 | 国产超碰人人爽人人做人人添 | 日韩精品无码免费一区二区三区 | 九月婷婷人人澡人人添人人爽 | 亚洲国产精品成人久久蜜臀 | 人人超人人超碰超国产 | 国産精品久久久久久久 | 全球成人中文在线 | 熟妇女人妻丰满少妇中文字幕 | 久久www免费人成人片 | 国产亚洲人成在线播放 | 人人妻人人澡人人爽欧美一区 | 老司机亚洲精品影院无码 | 性色欲网站人妻丰满中文久久不卡 | 无码中文字幕色专区 | 欧美高清在线精品一区 | 少妇激情av一区二区 | 色一情一乱一伦一视频免费看 | 黑人玩弄人妻中文在线 | 精品水蜜桃久久久久久久 | 特黄特色大片免费播放器图片 | 欧美日本免费一区二区三区 | 天堂久久天堂av色综合 | 久激情内射婷内射蜜桃人妖 | 免费乱码人妻系列无码专区 | 欧洲精品码一区二区三区免费看 | 国产成人精品无码播放 | 欧美熟妇另类久久久久久多毛 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲精品一区二区三区婷婷月 | 精品亚洲韩国一区二区三区 | 国产精品无码成人午夜电影 | 任你躁国产自任一区二区三区 | 丰满肥臀大屁股熟妇激情视频 | 亚洲爆乳精品无码一区二区三区 | 在线亚洲高清揄拍自拍一品区 | 无码一区二区三区在线观看 | 内射爽无广熟女亚洲 | 国内揄拍国内精品少妇国语 | 熟女体下毛毛黑森林 | 老司机亚洲精品影院 | 国产高清不卡无码视频 | 欧美变态另类xxxx | 无码人中文字幕 | 黑人巨大精品欧美黑寡妇 | 性欧美疯狂xxxxbbbb | 久久久久久亚洲精品a片成人 | 伊人久久大香线蕉av一区二区 | 99久久久无码国产精品免费 | 欧美成人午夜精品久久久 | 少妇人妻av毛片在线看 | 国产精品va在线观看无码 | 爆乳一区二区三区无码 | 日本丰满熟妇videos | a片在线免费观看 | 大乳丰满人妻中文字幕日本 | 99精品久久毛片a片 | 精品少妇爆乳无码av无码专区 | 中文字幕人妻丝袜二区 | 亚洲aⅴ无码成人网站国产app | 国产内射爽爽大片视频社区在线 | 麻豆精产国品 | 一区二区三区乱码在线 | 欧洲 | 亚洲国产精品久久久天堂 | 亚欧洲精品在线视频免费观看 | 无码国产色欲xxxxx视频 | 在线 国产 欧美 亚洲 天堂 | 国产熟女一区二区三区四区五区 | 99久久99久久免费精品蜜桃 | aa片在线观看视频在线播放 | 在线欧美精品一区二区三区 | 少妇高潮一区二区三区99 | 久久综合九色综合97网 | 性生交大片免费看女人按摩摩 | 日本熟妇浓毛 | 国产亚洲精品久久久闺蜜 | 亚洲人亚洲人成电影网站色 | 久久精品人人做人人综合试看 | 国产电影无码午夜在线播放 | 亚洲熟妇色xxxxx亚洲 | 亚洲精品鲁一鲁一区二区三区 | 色婷婷香蕉在线一区二区 | 3d动漫精品啪啪一区二区中 | 美女黄网站人色视频免费国产 | 欧美人与禽猛交狂配 | 日本免费一区二区三区最新 | 98国产精品综合一区二区三区 | 国产乱码精品一品二品 | 日产国产精品亚洲系列 | 真人与拘做受免费视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 丰满少妇人妻久久久久久 | 伊人久久大香线蕉av一区二区 | 精品 日韩 国产 欧美 视频 | 少妇高潮喷潮久久久影院 | 亚洲七七久久桃花影院 | 亚洲乱亚洲乱妇50p | 欧美日韩一区二区综合 | 欧美丰满熟妇xxxx性ppx人交 | 日日橹狠狠爱欧美视频 | 成人aaa片一区国产精品 | 98国产精品综合一区二区三区 | 欧美人与禽zoz0性伦交 | 无码国模国产在线观看 | 亚洲一区二区三区无码久久 | 国产精品无码mv在线观看 | 国内揄拍国内精品少妇国语 | 少妇无码一区二区二三区 | 亚洲乱亚洲乱妇50p | 中文字幕无码免费久久99 | 亚洲精品午夜国产va久久成人 | 国产精品鲁鲁鲁 | 欧美人与物videos另类 | 女人高潮内射99精品 | 亲嘴扒胸摸屁股激烈网站 | 中文字幕人成乱码熟女app | 国产偷抇久久精品a片69 | 福利一区二区三区视频在线观看 | 久久伊人色av天堂九九小黄鸭 | aⅴ亚洲 日韩 色 图网站 播放 | 天堂亚洲2017在线观看 | 一本久道久久综合狠狠爱 | 乌克兰少妇xxxx做受 | 又湿又紧又大又爽a视频国产 | 欧美国产亚洲日韩在线二区 | 熟妇激情内射com | 久久综合九色综合97网 | 黑人巨大精品欧美一区二区 | 久久久久久久女国产乱让韩 | 色综合久久88色综合天天 | 亚洲国产精品一区二区美利坚 | 波多野结衣乳巨码无在线观看 | 国产精品欧美成人 | 亚洲一区二区三区四区 | 人人妻人人澡人人爽欧美一区 | 亚洲男女内射在线播放 | 久久久久久国产精品无码下载 | 日日天日日夜日日摸 | 无码av免费一区二区三区试看 | 精品日本一区二区三区在线观看 | 一本久道久久综合狠狠爱 | 国产香蕉尹人视频在线 | 无套内谢的新婚少妇国语播放 | 亚洲 激情 小说 另类 欧美 | 精品无人国产偷自产在线 | 2019nv天堂香蕉在线观看 | 老熟妇乱子伦牲交视频 | 老太婆性杂交欧美肥老太 | 国产人妻精品一区二区三区 | 人妻尝试又大又粗久久 | 国产精品igao视频网 | 精品久久久久香蕉网 | 丰满肥臀大屁股熟妇激情视频 | 99久久精品午夜一区二区 | 国产精品高潮呻吟av久久 | 强伦人妻一区二区三区视频18 | 午夜男女很黄的视频 | yw尤物av无码国产在线观看 | 人人澡人摸人人添 | 亚洲国产精品一区二区第一页 | 狂野欧美性猛交免费视频 | 精品人妻av区 | 人妻少妇精品视频专区 | 国产精品高潮呻吟av久久 | 中文字幕无码日韩欧毛 | 欧美熟妇另类久久久久久不卡 | 国产成人无码a区在线观看视频app | 久久人人97超碰a片精品 | 一个人看的www免费视频在线观看 | 久久综合九色综合欧美狠狠 | 老头边吃奶边弄进去呻吟 | 精品乱子伦一区二区三区 | 六月丁香婷婷色狠狠久久 | 欧美日韩在线亚洲综合国产人 | 大地资源网第二页免费观看 | 97夜夜澡人人双人人人喊 | 久久人人爽人人爽人人片av高清 | 女人被男人爽到呻吟的视频 | 窝窝午夜理论片影院 | 久久综合给合久久狠狠狠97色 | 亚洲欧美色中文字幕在线 | 国内丰满熟女出轨videos | 精品偷拍一区二区三区在线看 | 久久综合狠狠综合久久综合88 | 在线精品亚洲一区二区 | 无套内射视频囯产 | 又紧又大又爽精品一区二区 | 蜜桃无码一区二区三区 | 装睡被陌生人摸出水好爽 | 久久国产精品二国产精品 | 色老头在线一区二区三区 | 亚洲 高清 成人 动漫 | 精品国产精品久久一区免费式 | 国内精品一区二区三区不卡 | 无码av岛国片在线播放 | 国产欧美精品一区二区三区 | 久久久精品456亚洲影院 | 亚洲无人区一区二区三区 | 伊在人天堂亚洲香蕉精品区 | 国产精品久久久久影院嫩草 | 精品国产av色一区二区深夜久久 | 久久久av男人的天堂 | 亚洲欧美国产精品久久 | 成人免费无码大片a毛片 | 亚洲欧美日韩国产精品一区二区 | 人妻无码久久精品人妻 | 免费观看黄网站 | 中文字幕人妻丝袜二区 | 成人一在线视频日韩国产 | 熟妇人妻无码xxx视频 | 久久亚洲国产成人精品性色 | 国产成人av免费观看 | 午夜熟女插插xx免费视频 | 99国产精品白浆在线观看免费 | 中文字幕无码视频专区 | 大屁股大乳丰满人妻 | 亚洲人成网站免费播放 | 少妇的肉体aa片免费 | 女人被爽到呻吟gif动态图视看 | 老熟女重囗味hdxx69 | 日韩精品无码一本二本三本色 | 亚洲综合精品香蕉久久网 | 免费观看激色视频网站 | 久久人人爽人人爽人人片av高清 | 国产av无码专区亚洲awww | 131美女爱做视频 | 大色综合色综合网站 | 波多野结衣乳巨码无在线观看 | 无码人中文字幕 | 国产绳艺sm调教室论坛 | 亚洲午夜无码久久 | 午夜精品久久久内射近拍高清 | 午夜不卡av免费 一本久久a久久精品vr综合 | 久久精品国产99精品亚洲 | 国产明星裸体无码xxxx视频 | 色情久久久av熟女人妻网站 | 午夜性刺激在线视频免费 | 国产激情无码一区二区app | 国产亲子乱弄免费视频 | 一本无码人妻在中文字幕免费 | 无码人妻出轨黑人中文字幕 | 丰满人妻一区二区三区免费视频 | 日本一本二本三区免费 | 日本熟妇人妻xxxxx人hd | 熟妇女人妻丰满少妇中文字幕 | 99国产精品白浆在线观看免费 | 性色欲情网站iwww九文堂 | 偷窥村妇洗澡毛毛多 | 亚洲中文无码av永久不收费 | 亚洲色在线无码国产精品不卡 | 又紧又大又爽精品一区二区 | 久久天天躁狠狠躁夜夜免费观看 | 熟妇人妻无乱码中文字幕 | 大地资源中文第3页 | 精品国产麻豆免费人成网站 | 97久久超碰中文字幕 | 免费无码一区二区三区蜜桃大 | 一本加勒比波多野结衣 | 国产精品美女久久久久av爽李琼 | 一本大道久久东京热无码av | 亚洲码国产精品高潮在线 | 亚洲日韩av一区二区三区中文 | 久久久久久av无码免费看大片 | av无码久久久久不卡免费网站 | а√天堂www在线天堂小说 | 日韩成人一区二区三区在线观看 | 亚洲人成影院在线无码按摩店 | 色欲久久久天天天综合网精品 | 亚洲综合伊人久久大杳蕉 | 色综合久久中文娱乐网 | 欧美日韩一区二区免费视频 | 麻豆国产97在线 | 欧洲 | 无码一区二区三区在线 | 纯爱无遮挡h肉动漫在线播放 | 奇米影视7777久久精品 | 人人澡人人妻人人爽人人蜜桃 | √天堂中文官网8在线 | 青草青草久热国产精品 | 激情五月综合色婷婷一区二区 | 色五月丁香五月综合五月 | 久久婷婷五月综合色国产香蕉 | 精品欧美一区二区三区久久久 | 久久久精品欧美一区二区免费 | 久久久久久九九精品久 | 国产av无码专区亚洲a∨毛片 | 亚洲国产高清在线观看视频 | 久久综合给合久久狠狠狠97色 | 成熟人妻av无码专区 | 日韩精品久久久肉伦网站 | 日韩无码专区 | 性欧美熟妇videofreesex | 四十如虎的丰满熟妇啪啪 | 中文字幕无码免费久久99 | 日韩人妻无码一区二区三区久久99 | 国产亚洲视频中文字幕97精品 | 人妻无码久久精品人妻 | 窝窝午夜理论片影院 | 国内综合精品午夜久久资源 | av在线亚洲欧洲日产一区二区 | 亚洲熟女一区二区三区 | 男人扒开女人内裤强吻桶进去 | 久久国产精品精品国产色婷婷 | 狠狠色噜噜狠狠狠狠7777米奇 | 性啪啪chinese东北女人 | 国产精品a成v人在线播放 | 麻豆蜜桃av蜜臀av色欲av | 黑人粗大猛烈进出高潮视频 | 一本色道婷婷久久欧美 | 欧美亚洲日韩国产人成在线播放 | 国产精品久免费的黄网站 | 午夜男女很黄的视频 | 国产美女极度色诱视频www | 亚洲精品成人av在线 | 伊在人天堂亚洲香蕉精品区 | 少妇人妻偷人精品无码视频 | 欧美日韩人成综合在线播放 | 日韩精品无码一区二区中文字幕 | 久久午夜无码鲁丝片午夜精品 | 国产又粗又硬又大爽黄老大爷视 | 国产成人无码午夜视频在线观看 | 成 人 网 站国产免费观看 | 99久久精品无码一区二区毛片 | 国产人妖乱国产精品人妖 | 九九久久精品国产免费看小说 | 在线成人www免费观看视频 | 亚洲精品鲁一鲁一区二区三区 | 亚洲 高清 成人 动漫 | 人妻尝试又大又粗久久 | 国产成人综合色在线观看网站 | 亚洲大尺度无码无码专区 | 日本大香伊一区二区三区 | 中文无码精品a∨在线观看不卡 | 1000部夫妻午夜免费 | 久久国产精品二国产精品 | 18禁黄网站男男禁片免费观看 | 岛国片人妻三上悠亚 | 高潮喷水的毛片 | a在线亚洲男人的天堂 | 国产九九九九九九九a片 | 免费无码av一区二区 | 欧美日韩在线亚洲综合国产人 | 亚洲色偷偷男人的天堂 | 内射老妇bbwx0c0ck | 国产乱子伦视频在线播放 | 日本一区二区三区免费高清 | 成人欧美一区二区三区黑人免费 | 最新国产乱人伦偷精品免费网站 | 性啪啪chinese东北女人 | 欧美猛少妇色xxxxx | 亚洲色欲久久久综合网东京热 | 又大又黄又粗又爽的免费视频 | 久久国产36精品色熟妇 | 亚洲精品午夜无码电影网 | 亚洲男女内射在线播放 | 在线播放无码字幕亚洲 | 精品无码国产一区二区三区av | 牲欲强的熟妇农村老妇女视频 | 亚洲成av人综合在线观看 | 久青草影院在线观看国产 | 亚洲色大成网站www国产 | 久久亚洲a片com人成 | 黄网在线观看免费网站 | 麻豆md0077饥渴少妇 | 波多野结衣av一区二区全免费观看 | 精品乱码久久久久久久 | 国产亚洲精品久久久久久国模美 | 亚洲午夜福利在线观看 | 色婷婷av一区二区三区之红樱桃 | 1000部夫妻午夜免费 | 国产精品久久国产精品99 | 欧美日韩人成综合在线播放 | 亚洲国产欧美在线成人 | 国产性生大片免费观看性 | 亚洲综合无码久久精品综合 | 国产精品国产自线拍免费软件 | 最近免费中文字幕中文高清百度 | 中文无码成人免费视频在线观看 | 亚洲中文字幕成人无码 | 亚洲欧美国产精品久久 | 精品国偷自产在线 | 波多野结衣 黑人 | 欧美xxxx黑人又粗又长 | 亚洲综合伊人久久大杳蕉 | 国产成人无码午夜视频在线观看 | 乱中年女人伦av三区 | 成人性做爰aaa片免费看不忠 | 精品亚洲韩国一区二区三区 | 国产精品对白交换视频 | 成 人 网 站国产免费观看 | 国产精品成人av在线观看 | 青青久在线视频免费观看 | 中国大陆精品视频xxxx | 国产精品久久久久久久影院 | 国产黄在线观看免费观看不卡 | 精品人妻人人做人人爽夜夜爽 | 亚洲成av人影院在线观看 | 永久免费精品精品永久-夜色 | 性生交大片免费看女人按摩摩 | 在线 国产 欧美 亚洲 天堂 | 成年美女黄网站色大免费全看 | 麻豆国产丝袜白领秘书在线观看 | 内射老妇bbwx0c0ck | 亚洲日韩中文字幕在线播放 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 久久国产精品二国产精品 | 漂亮人妻洗澡被公强 日日躁 | 无码毛片视频一区二区本码 | 久久综合久久自在自线精品自 | 日本一卡2卡3卡四卡精品网站 | 久久www免费人成人片 | 国产成人无码午夜视频在线观看 | 亚洲精品综合一区二区三区在线 | 久久精品国产精品国产精品污 | 色欲人妻aaaaaaa无码 | 又紧又大又爽精品一区二区 | 国产亚洲精品久久久闺蜜 | 国产成人综合在线女婷五月99播放 | 少妇性俱乐部纵欲狂欢电影 | 4hu四虎永久在线观看 | 久久久成人毛片无码 | 亚洲精品欧美二区三区中文字幕 | 丰满少妇弄高潮了www | 国产熟女一区二区三区四区五区 | 玩弄少妇高潮ⅹxxxyw | 久久99精品国产麻豆蜜芽 | 人妻插b视频一区二区三区 | 青春草在线视频免费观看 | 影音先锋中文字幕无码 | 欧美丰满少妇xxxx性 | 婷婷色婷婷开心五月四房播播 | 国产精品高潮呻吟av久久4虎 | 亚洲人成网站在线播放942 | 精品无码一区二区三区的天堂 | 婷婷五月综合缴情在线视频 | 男女作爱免费网站 | 国产办公室秘书无码精品99 | 鲁鲁鲁爽爽爽在线视频观看 | 岛国片人妻三上悠亚 | 国产色视频一区二区三区 | 综合激情五月综合激情五月激情1 | 亚洲国产一区二区三区在线观看 | 2020久久香蕉国产线看观看 | 久久天天躁夜夜躁狠狠 | 精品欧美一区二区三区久久久 | 999久久久国产精品消防器材 | 久久99精品国产麻豆蜜芽 | 人妻aⅴ无码一区二区三区 | 天天躁日日躁狠狠躁免费麻豆 | 奇米影视7777久久精品人人爽 | 狠狠躁日日躁夜夜躁2020 | 好男人社区资源 | 国产手机在线αⅴ片无码观看 | 精品人妻人人做人人爽 | 中文无码伦av中文字幕 | 十八禁视频网站在线观看 | 荫蒂添的好舒服视频囗交 | 婷婷色婷婷开心五月四房播播 | 香港三级日本三级妇三级 | 亚洲一区二区三区四区 | 亚洲色偷偷男人的天堂 | 东京热一精品无码av | 亚洲成色www久久网站 | 秋霞成人午夜鲁丝一区二区三区 | 精品人妻av区 | 亚洲综合无码久久精品综合 | 国产精品美女久久久网av | 麻豆果冻传媒2021精品传媒一区下载 | 精品欧美一区二区三区久久久 | 成人一在线视频日韩国产 | 大胆欧美熟妇xx | 国产精品-区区久久久狼 | 国产av一区二区精品久久凹凸 | 色综合天天综合狠狠爱 | 国产成人av免费观看 | 黄网在线观看免费网站 | 亚洲精品中文字幕久久久久 | 成人无码精品一区二区三区 | 精品国产一区av天美传媒 | 国产又爽又猛又粗的视频a片 | 人妻aⅴ无码一区二区三区 | 国产精品亚洲а∨无码播放麻豆 | 亚洲一区av无码专区在线观看 | 男女性色大片免费网站 | 欧美丰满老熟妇xxxxx性 | 亚洲经典千人经典日产 | 国产成人无码av在线影院 | 99久久无码一区人妻 | 国产精品久久久久7777 | 欧美野外疯狂做受xxxx高潮 | 无码纯肉视频在线观看 | 蜜臀av无码人妻精品 | 中文字幕av日韩精品一区二区 | 人人妻人人澡人人爽欧美一区 | 久久久亚洲欧洲日产国码αv | 国产超碰人人爽人人做人人添 | 国产成人久久精品流白浆 | 1000部夫妻午夜免费 | 乌克兰少妇xxxx做受 | 色窝窝无码一区二区三区色欲 | 国精产品一区二区三区 | 一二三四在线观看免费视频 | 亚洲欧洲无卡二区视頻 | 日韩精品无码一本二本三本色 | 国产精品第一区揄拍无码 | 无码乱肉视频免费大全合集 | 久久久久国色av免费观看性色 | 激情国产av做激情国产爱 | 俺去俺来也www色官网 | 午夜丰满少妇性开放视频 | 欧美丰满熟妇xxxx性ppx人交 | 无遮挡啪啪摇乳动态图 | 一本久道久久综合狠狠爱 | 奇米影视888欧美在线观看 | 99er热精品视频 | 久久人妻内射无码一区三区 | 国产人妻精品午夜福利免费 | 亚洲综合无码一区二区三区 | 亚洲中文字幕乱码av波多ji | 狠狠亚洲超碰狼人久久 | 亚洲综合精品香蕉久久网 | 人妻少妇精品视频专区 | 亚洲另类伦春色综合小说 | 亚洲精品一区二区三区四区五区 | 丰满少妇熟乱xxxxx视频 | 亚洲欧美综合区丁香五月小说 | 久久99国产综合精品 | 精品无人区无码乱码毛片国产 | 97久久精品无码一区二区 | 国产精品亚洲а∨无码播放麻豆 | 麻豆蜜桃av蜜臀av色欲av | 久久99精品久久久久久动态图 | 精品久久久无码人妻字幂 | 少妇无码吹潮 | 日韩无码专区 | 性啪啪chinese东北女人 | 欧美日本精品一区二区三区 | 99久久亚洲精品无码毛片 | 强开小婷嫩苞又嫩又紧视频 | 国内揄拍国内精品人妻 | 日日天干夜夜狠狠爱 | 国产成人亚洲综合无码 | 亚洲成av人片在线观看无码不卡 | 久久久久成人精品免费播放动漫 | 人人妻人人澡人人爽人人精品 | 久久久久久久人妻无码中文字幕爆 | 欧美午夜特黄aaaaaa片 | 2020久久香蕉国产线看观看 | 久久久久久久女国产乱让韩 | 亚洲无人区午夜福利码高清完整版 | 成熟人妻av无码专区 | 国产麻豆精品精东影业av网站 | 日日摸日日碰夜夜爽av | 男女下面进入的视频免费午夜 | 白嫩日本少妇做爰 | 天堂亚洲免费视频 | 亚洲乱亚洲乱妇50p | 无码人妻精品一区二区三区不卡 | 亚洲精品久久久久avwww潮水 | 欧美成人家庭影院 | 久久99热只有频精品8 | 国产极品视觉盛宴 | 性生交片免费无码看人 | 国产精品内射视频免费 | 奇米影视888欧美在线观看 | 欧美老妇与禽交 | 国产精品人人爽人人做我的可爱 | 草草网站影院白丝内射 | 国产三级精品三级男人的天堂 | 午夜不卡av免费 一本久久a久久精品vr综合 | 大屁股大乳丰满人妻 | 日日碰狠狠躁久久躁蜜桃 | 亚洲国产成人a精品不卡在线 | 国产综合在线观看 | 久久精品女人天堂av免费观看 | 亚洲精品中文字幕久久久久 | 国产乱子伦视频在线播放 | 成人免费视频视频在线观看 免费 | 天天躁日日躁狠狠躁免费麻豆 | 久久久婷婷五月亚洲97号色 | 亚洲欧美精品伊人久久 | 欧美人妻一区二区三区 | 牲欲强的熟妇农村老妇女视频 | 荫蒂添的好舒服视频囗交 | 无码av岛国片在线播放 | 亚洲欧美国产精品专区久久 | 日本丰满护士爆乳xxxx | 久久97精品久久久久久久不卡 | 窝窝午夜理论片影院 | 欧美色就是色 | 1000部夫妻午夜免费 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲精品中文字幕久久久久 | 久久成人a毛片免费观看网站 | 特级做a爰片毛片免费69 | 人人妻人人澡人人爽欧美一区九九 | 99精品国产综合久久久久五月天 | 国产激情无码一区二区 | 亚洲aⅴ无码成人网站国产app | 中文字幕乱码亚洲无线三区 | 人人妻人人藻人人爽欧美一区 | 日韩欧美中文字幕公布 | 亚洲精品鲁一鲁一区二区三区 | 日韩精品成人一区二区三区 | 精品无码国产一区二区三区av | 亚洲国产成人av在线观看 | 波多野结衣av在线观看 | 亚洲国产av精品一区二区蜜芽 | 久久99热只有频精品8 | 午夜男女很黄的视频 | 色婷婷香蕉在线一区二区 | 内射后入在线观看一区 | 久久久精品欧美一区二区免费 | 免费中文字幕日韩欧美 | 又粗又大又硬又长又爽 | 99视频精品全部免费免费观看 | 国精品人妻无码一区二区三区蜜柚 | 一区二区三区乱码在线 | 欧洲 | 狂野欧美激情性xxxx | 玩弄人妻少妇500系列视频 | 国产偷抇久久精品a片69 | 精品人妻人人做人人爽 | 东京热无码av男人的天堂 | 少妇被黑人到高潮喷出白浆 | 好爽又高潮了毛片免费下载 | 亚洲国产精品无码久久久久高潮 | 日韩av激情在线观看 | 无码中文字幕色专区 | 欧美精品免费观看二区 | 亚洲日韩一区二区三区 | 成人片黄网站色大片免费观看 | 99久久精品无码一区二区毛片 | 在线 国产 欧美 亚洲 天堂 | 国产成人精品三级麻豆 | 亚洲爆乳精品无码一区二区三区 | 国产精品二区一区二区aⅴ污介绍 | 无码av中文字幕免费放 | 成人无码精品1区2区3区免费看 | 2020久久香蕉国产线看观看 | 骚片av蜜桃精品一区 | 在线观看国产午夜福利片 | 亚洲成av人片天堂网无码】 | 俺去俺来也www色官网 | 少妇厨房愉情理9仑片视频 | 欧美激情综合亚洲一二区 | 欧美喷潮久久久xxxxx | 国产成人精品三级麻豆 | 国产精品怡红院永久免费 | 亚洲人成影院在线无码按摩店 | 亚洲精品一区二区三区在线观看 | 无码一区二区三区在线观看 | 免费无码一区二区三区蜜桃大 | 嫩b人妻精品一区二区三区 | 露脸叫床粗话东北少妇 | 成人性做爰aaa片免费看 | 在线观看欧美一区二区三区 | 精品久久久中文字幕人妻 | 亚洲国产精品久久人人爱 | 亚洲成av人片在线观看无码不卡 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲成色在线综合网站 | 国内精品人妻无码久久久影院 | 无码帝国www无码专区色综合 | 日韩精品无码免费一区二区三区 | 久久精品国产日本波多野结衣 | 国产精品永久免费视频 | 亚洲精品中文字幕久久久久 | 狠狠色欧美亚洲狠狠色www | 婷婷色婷婷开心五月四房播播 | √天堂资源地址中文在线 | 无码人中文字幕 | 麻豆md0077饥渴少妇 | 亚洲欧美国产精品专区久久 | 久久无码中文字幕免费影院蜜桃 | 久久精品人人做人人综合试看 | 内射老妇bbwx0c0ck | 国产极品视觉盛宴 | 国产av无码专区亚洲a∨毛片 | 中文字幕人妻无码一区二区三区 | 色综合久久中文娱乐网 | 免费人成在线观看网站 | 青青青爽视频在线观看 | 亚洲人亚洲人成电影网站色 | 日韩亚洲欧美中文高清在线 | 国产极品美女高潮无套在线观看 | 久久婷婷五月综合色国产香蕉 | 精品人人妻人人澡人人爽人人 | 久久精品一区二区三区四区 | 日日麻批免费40分钟无码 | 97夜夜澡人人爽人人喊中国片 | 乱码午夜-极国产极内射 | 天堂а√在线地址中文在线 | 亚洲人成网站色7799 | 国产成人无码av片在线观看不卡 | 中文字幕人成乱码熟女app | 亚洲国产日韩a在线播放 | yw尤物av无码国产在线观看 | 久久zyz资源站无码中文动漫 | 人人妻人人澡人人爽人人精品浪潮 | 美女极度色诱视频国产 | 内射后入在线观看一区 | 国产精品久久国产三级国 | 欧美性猛交内射兽交老熟妇 | 亚洲一区二区三区在线观看网站 | www成人国产高清内射 | 国产美女极度色诱视频www | 午夜精品一区二区三区的区别 | 男女爱爱好爽视频免费看 | 国产成人av免费观看 | 国产亚洲日韩欧美另类第八页 | 亚洲成色www久久网站 | 国产精品-区区久久久狼 | 成人女人看片免费视频放人 | 免费男性肉肉影院 | 最近中文2019字幕第二页 | 欧美自拍另类欧美综合图片区 | 亚洲成在人网站无码天堂 | 免费观看的无遮挡av | 性欧美熟妇videofreesex | 少妇无码av无码专区在线观看 | 日本乱人伦片中文三区 | 亚洲天堂2017无码中文 | 永久黄网站色视频免费直播 | 亚洲国产精品美女久久久久 | 亚洲娇小与黑人巨大交 | 亚洲精品无码人妻无码 | 国产精品福利视频导航 | 国产真实乱对白精彩久久 | 色一情一乱一伦 | 亚洲欧洲日本综合aⅴ在线 | 精品人妻av区 | 小sao货水好多真紧h无码视频 | 一本色道婷婷久久欧美 | 任你躁国产自任一区二区三区 | 亚洲人成人无码网www国产 | 骚片av蜜桃精品一区 | 少妇愉情理伦片bd | 无码吃奶揉捏奶头高潮视频 | 麻豆精品国产精华精华液好用吗 | 亚洲第一无码av无码专区 | 精品久久综合1区2区3区激情 | 欧美熟妇另类久久久久久不卡 | 日韩欧美群交p片內射中文 | 日本大乳高潮视频在线观看 | 国产电影无码午夜在线播放 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲狠狠婷婷综合久久 | 亚洲乱码国产乱码精品精 | 少妇激情av一区二区 | 丰满人妻一区二区三区免费视频 | 亚洲春色在线视频 | 亚洲码国产精品高潮在线 | 国产无遮挡吃胸膜奶免费看 | 少妇高潮喷潮久久久影院 | 久久久久se色偷偷亚洲精品av | 亚洲 激情 小说 另类 欧美 | 精品一区二区三区无码免费视频 | 麻花豆传媒剧国产免费mv在线 | 久久亚洲中文字幕精品一区 | 色老头在线一区二区三区 | 免费看少妇作爱视频 | 国产精品怡红院永久免费 | 成人精品一区二区三区中文字幕 | 精品久久久无码中文字幕 | 国产精品.xx视频.xxtv | 色 综合 欧美 亚洲 国产 | av无码不卡在线观看免费 | 亚洲人成网站免费播放 | 国产无遮挡又黄又爽又色 | 亚洲精品综合一区二区三区在线 | 精品人妻中文字幕有码在线 | 国产精品久久久久久亚洲影视内衣 | 亚洲综合在线一区二区三区 | 全球成人中文在线 | 牲欲强的熟妇农村老妇女视频 | a国产一区二区免费入口 | 伊人久久大香线蕉av一区二区 | 骚片av蜜桃精品一区 | 亚洲精品成人av在线 | 国产激情一区二区三区 | 亚洲色大成网站www | 无码av免费一区二区三区试看 | 中文字幕无码人妻少妇免费 | 国语自产偷拍精品视频偷 | 成年美女黄网站色大免费全看 | 日韩av无码一区二区三区不卡 | 国产在线精品一区二区三区直播 | 国产人妻人伦精品1国产丝袜 | 综合激情五月综合激情五月激情1 | 欧美国产日韩久久mv | 国内精品人妻无码久久久影院 | 欧美人与牲动交xxxx | 中国女人内谢69xxxxxa片 | 午夜精品一区二区三区在线观看 | 国产精品久久久av久久久 | 国产热a欧美热a在线视频 | 人妻体内射精一区二区三四 | 精品久久久久香蕉网 | 国产成人人人97超碰超爽8 | 波多野结衣高清一区二区三区 | 欧美性猛交xxxx富婆 | 全黄性性激高免费视频 | 成人精品天堂一区二区三区 | 伊人色综合久久天天小片 | 夜夜影院未满十八勿进 | 午夜理论片yy44880影院 | 久久无码中文字幕免费影院蜜桃 | аⅴ资源天堂资源库在线 | 少女韩国电视剧在线观看完整 | 国内老熟妇对白xxxxhd | 久久精品人妻少妇一区二区三区 | 精品国产福利一区二区 | 国产av无码专区亚洲a∨毛片 | 亚洲日本va午夜在线电影 | 国产人妻久久精品二区三区老狼 | 国内老熟妇对白xxxxhd | 动漫av网站免费观看 | 精品午夜福利在线观看 | 亚洲人成网站在线播放942 | 波多野42部无码喷潮在线 | 国产成人无码区免费内射一片色欲 | 天天av天天av天天透 | 国产精品久久久久久亚洲毛片 | 亚洲精品国产a久久久久久 | 亚洲乱码国产乱码精品精 | 精品国产精品久久一区免费式 | 日韩人妻系列无码专区 | 亚洲综合色区中文字幕 | 性欧美疯狂xxxxbbbb | 日韩成人一区二区三区在线观看 | 国产激情精品一区二区三区 | 日本又色又爽又黄的a片18禁 | 中文字幕乱码人妻二区三区 | 成人三级无码视频在线观看 | 少女韩国电视剧在线观看完整 | 中国大陆精品视频xxxx | 无码精品人妻一区二区三区av | 日本丰满熟妇videos | 美女极度色诱视频国产 | 国产精品高潮呻吟av久久4虎 | 高清国产亚洲精品自在久久 | 欧美老妇交乱视频在线观看 | 国产精品亚洲а∨无码播放麻豆 | 久久午夜无码鲁丝片午夜精品 | 欧美乱妇无乱码大黄a片 | 奇米影视888欧美在线观看 | 亚洲の无码国产の无码影院 | 国产午夜福利100集发布 | 免费无码的av片在线观看 | 精品无码一区二区三区爱欲 | √天堂中文官网8在线 | 丰满少妇女裸体bbw | 国产一区二区三区四区五区加勒比 | 99久久人妻精品免费二区 | 欧美人妻一区二区三区 | 精品欧美一区二区三区久久久 | 精品欧美一区二区三区久久久 | 无码人中文字幕 | 国产一区二区三区日韩精品 | 图片小说视频一区二区 | 国产无套粉嫩白浆在线 | 国产精品成人av在线观看 | 亚洲日韩中文字幕在线播放 | 一个人免费观看的www视频 | 熟女少妇人妻中文字幕 | 丰满妇女强制高潮18xxxx | 亚洲精品国产a久久久久久 | 狠狠躁日日躁夜夜躁2020 | 人人妻人人澡人人爽人人精品 | 成人女人看片免费视频放人 | 亚洲色欲色欲欲www在线 | 无码吃奶揉捏奶头高潮视频 | 成年美女黄网站色大免费视频 | 国产超碰人人爽人人做人人添 | 国产成人综合在线女婷五月99播放 | 国产午夜无码精品免费看 | 国产成人精品一区二区在线小狼 | 久久久婷婷五月亚洲97号色 | 国产精品久久国产三级国 | 欧美三级不卡在线观看 | 国产亚洲精品久久久久久久久动漫 | 亚洲国产日韩a在线播放 | 久久久久久国产精品无码下载 | 国产av无码专区亚洲a∨毛片 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲欧美中文字幕5发布 | 国产精品办公室沙发 | 国产超碰人人爽人人做人人添 | 亚洲精品成a人在线观看 | 丰满少妇熟乱xxxxx视频 | 欧美日本免费一区二区三区 | 国产区女主播在线观看 | 澳门永久av免费网站 | 国产精品毛多多水多 | 色一情一乱一伦一区二区三欧美 | 99视频精品全部免费免费观看 | 大乳丰满人妻中文字幕日本 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产精品久久久久影院嫩草 | yw尤物av无码国产在线观看 | 中文毛片无遮挡高清免费 | 娇妻被黑人粗大高潮白浆 | 激情综合激情五月俺也去 | 水蜜桃色314在线观看 | 中文亚洲成a人片在线观看 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品国产三级国产专播 | 全球成人中文在线 | 国产亚洲精品久久久闺蜜 | 日日碰狠狠丁香久燥 | 亚洲爆乳大丰满无码专区 | 久久国产精品_国产精品 | 亚洲s色大片在线观看 | 国产精品久久久久无码av色戒 | 色婷婷香蕉在线一区二区 | 麻豆精产国品 | 欧美 亚洲 国产 另类 | 亚洲中文无码av永久不收费 | 玩弄中年熟妇正在播放 | 5858s亚洲色大成网站www | 日本欧美一区二区三区乱码 | 成人无码影片精品久久久 | 99久久精品午夜一区二区 | 亚洲精品鲁一鲁一区二区三区 | 亚洲s色大片在线观看 | 中国大陆精品视频xxxx | 国产精品久久久久7777 | 久久综合香蕉国产蜜臀av | 日日碰狠狠躁久久躁蜜桃 | 亚洲熟妇色xxxxx欧美老妇 | 成人性做爰aaa片免费看不忠 | 99久久婷婷国产综合精品青草免费 | 亚洲中文字幕在线观看 | 婷婷五月综合缴情在线视频 | 牲欲强的熟妇农村老妇女视频 | 亚洲精品国产品国语在线观看 | 狠狠色噜噜狠狠狠7777奇米 | 成在人线av无码免观看麻豆 | 久久精品人妻少妇一区二区三区 | 成人精品一区二区三区中文字幕 | 国精品人妻无码一区二区三区蜜柚 | 成人免费视频视频在线观看 免费 | 装睡被陌生人摸出水好爽 | 波多野结衣av一区二区全免费观看 | 国产熟妇另类久久久久 | 人人妻人人藻人人爽欧美一区 | 日日夜夜撸啊撸 | 88国产精品欧美一区二区三区 | 精品久久综合1区2区3区激情 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 女人高潮内射99精品 | www一区二区www免费 | 国产精品高潮呻吟av久久 | 午夜理论片yy44880影院 | 无码av最新清无码专区吞精 | 秋霞成人午夜鲁丝一区二区三区 | 漂亮人妻洗澡被公强 日日躁 | 亚洲国产日韩a在线播放 | 一个人看的www免费视频在线观看 | 亚洲第一无码av无码专区 | 亚洲欧美精品伊人久久 | 亚洲色大成网站www国产 | 18禁止看的免费污网站 | 激情综合激情五月俺也去 | 麻豆国产人妻欲求不满谁演的 | 内射巨臀欧美在线视频 | 午夜性刺激在线视频免费 | 久久午夜无码鲁丝片秋霞 | 玩弄中年熟妇正在播放 | 精品亚洲成av人在线观看 | 蜜桃视频韩日免费播放 | 女人被男人躁得好爽免费视频 | 久久久久久久久蜜桃 | 色综合久久中文娱乐网 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国模大胆一区二区三区 | 成人片黄网站色大片免费观看 | 国产高清不卡无码视频 | 亚洲乱亚洲乱妇50p | 无码av岛国片在线播放 | 久久久久久亚洲精品a片成人 | 欧美日韩一区二区免费视频 | 综合激情五月综合激情五月激情1 | 乱人伦人妻中文字幕无码 | 久久国产精品二国产精品 |