C 對(duì)于 json 文件的反序列化一直是開發(fā)中的重要部分。使用 C 來(lái)解析 json 文件,可以對(duì)文件進(jìn)行讀取并將其轉(zhuǎn)換成程序語(yǔ)言可以識(shí)別的數(shù)據(jù)格式。反序列化可以讓程序更方便地處理從外部獲取的數(shù)據(jù),如 API 響應(yīng)和數(shù)據(jù)庫(kù)記錄。下面是一個(gè)簡(jiǎn)單的反序列化 json 文件的示例:
#include <stdio.h> #include <jansson.h> int main() { /* 讀取 json 文件 */ FILE *file; char *buffer; long size; file = fopen("example.json", "rb"); fseek(file, 0, SEEK_END); size = ftell(file); rewind(file); buffer = malloc(size + 1); fread(buffer, 1, size, file); buffer[size] = '\0'; fclose(file); /* 反序列化 json 文件 */ json_t *root; json_error_t error; root = json_loads(buffer, 0, &error); free(buffer); if(!root) { fprintf(stderr, "error: on line %d: %s\n", error.line, error.text); return 1; } /* 操作反序列化后的 json 對(duì)象 */ json_t *name; const char *str; name = json_object_get(root, "name"); str = json_string_value(name); printf("name: %s\n", str); json_t *age; age = json_object_get(root, "age"); int num = json_integer_value(age); printf("age: %d\n", num); /* 釋放內(nèi)存 */ json_decref(root); return 0; }
在此示例中,我們首先打開并讀取了名為 "example.json" 的文件。我們使用了標(biāo)準(zhǔn) C 函數(shù)來(lái)獲取文件大小并使用指向大小和緩沖區(qū)的指針來(lái)讀取文件。然后,我們使用 json_loads() 函數(shù)將緩沖區(qū)中的 json 字符串轉(zhuǎn)換為 json_t 對(duì)象。該函數(shù)還返回一個(gè) json_error_t 結(jié)構(gòu)體,該結(jié)構(gòu)體包含任何可能的解析錯(cuò)誤。在此示例中,我們只是簡(jiǎn)單地將錯(cuò)誤信息輸出到 stderr 流。
接下來(lái),我們可以像訪問(wèn)任何其他 C 對(duì)象一樣地操作 json_t 對(duì)象。我們使用 json_object_get() 函數(shù)獲取對(duì)象中的值,并將其轉(zhuǎn)換為適當(dāng)?shù)?C 類型。此示例使用了簡(jiǎn)單的字符串和整數(shù)類型,但 json_t 對(duì)象可以包含其他類型,如數(shù)組和另一個(gè)對(duì)象。最后,我們使用 json_decref() 函數(shù)來(lái)減少 json_t 對(duì)象的引用計(jì)數(shù),并釋放分配的內(nèi)存。
總之,C 對(duì)于 json 文件的反序列化是一項(xiàng)非常有用和必要的技能,它可以使您的程序更容易地處理外部數(shù)據(jù)。json-c 是一個(gè)流行的 C 庫(kù),它提供了可緩解和可變 json_t 對(duì)象,可以使反序列化 json 文件變得更加容易。