在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對象時,我們使用了遞歸來處理其子節點,并使用動態內存分配和釋放來保證代碼的可重用性。
上一篇python 模塊名沖突
下一篇c 復雜json序列化