我們可以使用如下的結(jié)構(gòu)體來表示一個(gè)JSON對象:
typedef struct cJSON {
struct cJSON* next, * prev;
struct cJSON* child;
int type;
char* valuestring;
int valueint;
double valuedouble;
} cJSON;
其中,type字段表示該JSON對象的類型,它可以是:cJSON_False、cJSON_True、cJSON_NULL、cJSON_Number、cJSON_String、cJSON_Array以及cJSON_Object。如果該JSON對象是一個(gè)數(shù)組或?qū)ο螅敲碿hild字段將指向它的第一個(gè)元素,next字段將指向它的下一個(gè)元素。我們可以使用這些信息構(gòu)造一個(gè)遍歷JSON數(shù)據(jù)的算法。
算法的基本步驟如下:
// handle cJSON object or array
void handle_object_or_array(cJSON* obj) {
if (obj == NULL) return;
cJSON* child = obj->child;
while (child) {
// handle cJSON object or array recursively
if (child->type == cJSON_Object || child->type == cJSON_Array) {
handle_object_or_array(child);
}
// handle cJSON string, number, bool or null
else {
handle_string_or_number_or_bool_or_null(child);
}
child = child->next;
}
}
// handle cJSON string, number, bool or null
void handle_string_or_number_or_bool_or_null(cJSON* obj) {
if (obj == NULL) return;
switch (obj->type) {
case cJSON_String:
printf("string: %s\n", obj->valuestring);
break;
case cJSON_Number:
printf("number: %d\n", obj->valueint);
break;
case cJSON_False:
printf("bool: false\n");
break;
case cJSON_True:
printf("bool: true\n");
break;
case cJSON_NULL:
printf("null\n");
break;
default:
break;
}
}
在該算法中,我們通過遞歸的方式遍歷JSON數(shù)據(jù),并分別處理對象和數(shù)組及普通的字符串、數(shù)字、布爾或null值。這個(gè)算法可以很好地處理嵌套層數(shù)很深的JSON數(shù)據(jù)。但需要注意的是,該算法的每個(gè)分支都需要執(zhí)行相應(yīng)的處理代碼,否則可能會出現(xiàn)錯(cuò)誤或者未知的結(jié)果。