欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

c 復雜 json

錢艷冰2年前8瀏覽0評論

在C語言中,處理JSON數據是一項重要的任務。當JSON具有復雜結構時,解析它可能變得比較困難。這時候需要使用一些復雜的技巧和數據結構來處理JSON對象。

在處理包含嵌套數組和對象的JSON數據時,我們需要使用遞歸和動態內存分配等技術。下面是一個處理復雜JSON數據的示例代碼:

#include#include#include#include "cJSON.h"
typedef struct _json_node {
enum {
JSON_STRING,
JSON_OBJECT,
JSON_ARRAY
} type;
union {
char* str_val;
cJSON* obj_val;
cJSON* arr_val;
} value;
} json_node;
// 遞歸釋放json_node
void free_node(json_node* node) {
if (node == NULL) {
return;
}
if (node->type == JSON_OBJECT) {
cJSON_Delete(node->value.obj_val);
} else if (node->type == JSON_ARRAY) {
cJSON_Delete(node->value.arr_val);
} else if (node->type == JSON_STRING) {
if (node->value.str_val != NULL) {
free(node->value.str_val);
}
}
free(node);
}
// 解析JSON對象,返回json_node指針
json_node* parse_json(cJSON* json) {
if (json == NULL) {
return NULL;
}
json_node* node = (json_node*) malloc(sizeof(json_node));
if (node == NULL) {
return NULL;
}
if (json->type == cJSON_String) {
node->type = JSON_STRING;
node->value.str_val = strdup(json->valuestring);
} else if (json->type == cJSON_Object) {
node->type = JSON_OBJECT;
node->value.obj_val = json;
cJSON* child = json->child;
while (child != NULL) {
// 遞歸解析并添加子節點
json_node* child_node = parse_json(child);
if (child_node != NULL) {
cJSON_AddItemToObject(json, child->string, child);
}
free_node(child_node);
child = child->next;
}
} else if (json->type == cJSON_Array) {
node->type = JSON_ARRAY;
node->value.arr_val = json;
cJSON* child = json->child;
while (child != NULL) {
// 遞歸解析并添加子節點
json_node* child_node = parse_json(child);
if (child_node != NULL) {
cJSON_AddItemToArray(json, child);
}
free_node(child_node);
child = child->next;
}
}
return node;
}
int main() {
char* json_str = "{\"name\":\"Peter\",\"age\":25,\"gender\":\"male\",\"address\":{\"city\":\"Beijing\",\"district\":\"Haidian\"},\"phones\":[\"123456789\",\"987654321\"]}";
cJSON* json = cJSON_Parse(json_str);
if (json == NULL) {
printf("JSON解析失敗\n");
return -1;
}
json_node* root = parse_json(json);
// 處理解析出來的JSON對象
free_node(root);
cJSON_Delete(json);
return 0;
}

該代碼使用了自定義的json_node數據結構來表示JSON對象的某個節點,同時使用了cJSON庫來進行解析、添加子節點等操作。在解析JSON對象時,我們使用了遞歸來處理其子節點,并使用動態內存分配和釋放來保證代碼的可重用性。