在C語言中,使用Json作為數據傳送和存儲格式已經越來越普遍。Json作為輕量級的文本數據交換格式,能夠方便地在語言之間傳遞數據。但是,當Json數據結構比較復雜的時候,就需要使用復雜Json反序列化進行處理。
// Json數據 { "name": "John", "age": 30, "city": "New York", "children": [ { "name": "Mary", "age": 5 }, { "name": "Tom", "age": 7 } ] } // C語言結構體 typedef struct { char *name; int age; char *city; Child *children; int childrenCount; } Person; typedef struct { char *name; int age; } Child;
以上代碼展示了一個包含了嵌套數組的Json數據結構和對應的C語言結構體。
在代碼實現中,我們需要用到一個Json庫,比如jansson或cJSON。這里以cJSON為例。
// 使用cJSON庫進行反序列化 cJSON *root = cJSON_Parse(jsonText); Person person; person.name = cJSON_GetObjectItem(root, "name")->valuestring; person.age = cJSON_GetObjectItem(root, "age")->valueint; person.city = cJSON_GetObjectItem(root, "city")->valuestring; cJSON *childrenJson = cJSON_GetObjectItem(root, "children"); person.childrenCount = cJSON_GetArraySize(childrenJson); person.children = calloc(person.childrenCount, sizeof(Child)); for (int i = 0; i < person.childrenCount; i++) { cJSON *childJson = cJSON_GetArrayItem(childrenJson, i); person.children[i].name = cJSON_GetObjectItem(childJson, "name")->valuestring; person.children[i].age = cJSON_GetObjectItem(childJson, "age")->valueint; } cJSON_Delete(root);
在以上代碼中,我們首先解析整個Json數據到一個cJSON對象root中,然后根據Json數據結構解析到對應的C語言結構體中,并對子數組進行遍歷解析。
需要注意的是,在代碼中使用了calloc進行了內存分配,這是因為在解析嵌套數組時需要動態分配內存。
復雜Json反序列化在C語言中的實現有點繁瑣,但是它能讓我們方便地進行Json數據解析,使得C語言能夠更加靈活地與其他語言協同工作。