C語(yǔ)言中嵌套的結(jié)構(gòu)體非常常見(jiàn),我們有時(shí)需要將這些結(jié)構(gòu)體轉(zhuǎn)換為json格式進(jìn)行數(shù)據(jù)傳輸或存儲(chǔ)。
轉(zhuǎn)換的過(guò)程可以通過(guò)編寫(xiě)函數(shù)來(lái)實(shí)現(xiàn)。下面的示例代碼展示了一個(gè)嵌套的結(jié)構(gòu)體如何轉(zhuǎn)換為json:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int id; char name[50]; } Student; typedef struct { char course[50]; Student student; } Course; typedef struct { int year; Course courses[3]; } Semester; void json_from_semester(char *json, Semester *semester) { sprintf(json, "{ \"year\": %d, \"courses\": [", semester->year); for (int i = 0; i< 3; i++) { sprintf(json + strlen(json), "{ \"course\": \"%s\", \"student\": { \"id\": %d, \"name\": \"%s\" } }", semester->courses[i].course, semester->courses[i].student.id, semester->courses[i].student.name); if (i != 2) { sprintf(json + strlen(json), ", "); } } sprintf(json + strlen(json), " ] }"); } int main() { Semester semester = { .year = 2020, .courses = { { "course1", { 1, "Tom" } }, { "course2", { 2, "Jerry" } }, { "course3", { 3, "Spike" } } } }; char json[500]; json_from_semester(json, &semester); printf("%s\n", json); return 0; }
在該示例中,我們定義了三個(gè)結(jié)構(gòu)體。其中Semester結(jié)構(gòu)體包含一個(gè)整數(shù)表示年份和三個(gè)Course結(jié)構(gòu)體的數(shù)組。Course結(jié)構(gòu)體包含一個(gè)字符串表示課程名稱(chēng)和一個(gè)Student結(jié)構(gòu)體。Student結(jié)構(gòu)體包含一個(gè)整數(shù)表示學(xué)號(hào)和一個(gè)字符串表示姓名。
函數(shù)json_from_semester將Semester結(jié)構(gòu)體轉(zhuǎn)換為json字符串,并將其存儲(chǔ)在json指針指向的字符數(shù)組中。在函數(shù)中,我們使用sprintf函數(shù)將各個(gè)字段添加到j(luò)son字符串中。需要注意的是,在添加Course結(jié)構(gòu)體時(shí),我們使用嵌套的sprintf函數(shù)將Student結(jié)構(gòu)體也添加到了json字符串中。
使用C語(yǔ)言將嵌套的結(jié)構(gòu)體轉(zhuǎn)換為json并不復(fù)雜,并且可以自定義函數(shù)以適應(yīng)不同的數(shù)據(jù)結(jié)構(gòu)。在實(shí)際項(xiàng)目中,我們可以使用第三方的json庫(kù)來(lái)簡(jiǎn)化這個(gè)過(guò)程。