C反序列化成JSON是一個常見的操作。在很多情況下,我們需要將C語言中的結(jié)構(gòu)體或其他數(shù)據(jù)類型轉(zhuǎn)換成JSON格式,以便于在網(wǎng)絡(luò)傳輸中或存儲文件中進(jìn)行使用。下面,我們來介紹一下如何使用C語言進(jìn)行反序列化操作。
#include <stdio.h> #include <jansson.h> typedef struct{ int id; char name[20]; double score; } Student; int main(){ const char *json_str = "{\"id\":123,\"name\":\"Tom\",\"score\":99}"; json_error_t error; json_t *root; // 從JSON格式的字符串中讀取數(shù)據(jù)并封裝成JSON對象 root = json_loads(json_str, 0, &error); if (!root){ fprintf(stderr, "json_loads error: on line: %d, column: %d, text: %s\n", error.line, error.column, error.text); return -1; } Student student; // 解析JSON對象中的數(shù)據(jù) json_t *id = json_object_get(root, "id"); if(!json_is_integer(id)){ printf("Error: id is not integer\n"); return -1; } student.id = json_integer_value(id); json_t *name = json_object_get(root, "name"); if(!json_is_string(name)){ printf("Error: name is not string\n"); return -1; } strcpy(student.name, json_string_value(name)); json_t *score = json_object_get(root, "score"); if(!json_is_real(score)){ printf("Error: score is not real\n"); return -1; } student.score = json_real_value(score); // 打印解析出的結(jié)果 printf("Student: id=%d\tname=%s\tscore=%f\n", student.id, student.name, student.score); // 釋放內(nèi)存 json_decref(root); return 0; }
上述代碼通過調(diào)用json_loads()函數(shù)將JSON格式的字符串轉(zhuǎn)換為JSON對象,然后使用json_object_get()函數(shù)從JSON對象中取出對應(yīng)的值,并使用json_is_xxx()函數(shù)判斷值的類型,最后再通過json_xxx_value()函數(shù)取出具體的值。其中,json_t為封裝JSON數(shù)據(jù)的結(jié)構(gòu)體,json_error_t為記錄錯誤信息的結(jié)構(gòu)體。
通過反序列化操作,我們可以方便地將C語言中的數(shù)據(jù)轉(zhuǎn)換為JSON格式,實現(xiàn)數(shù)據(jù)的傳輸和存儲。