在web開發(fā)中,json格式的數(shù)據(jù)已經(jīng)成為一種非常重要的傳輸格式。在前端和后端接口數(shù)據(jù)交互的過程中,前端一般會將json數(shù)據(jù)轉(zhuǎn)換為js對象,而后端則一般會將json數(shù)據(jù)轉(zhuǎn)換為實體對象。在C語言中,實現(xiàn)json數(shù)據(jù)轉(zhuǎn)實體是一種非常實用的技能。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <jansson.h> typedef struct { int id; char name[20]; int age; } Person; int parse_person(const char *json_str, Person *p) { json_error_t error; json_t *root; root = json_loads(json_str, 0, &error); if(!root) { fprintf(stderr, "json error on line %d: %s\n", error.line, error.text); return -1; } if(!json_is_object(root)) { fprintf(stderr, "json error: root is not object\n"); return -1; } json_t *id_obj = json_object_get(root, "id"); json_t *name_obj = json_object_get(root, "name"); json_t *age_obj = json_object_get(root, "age"); if(!id_obj || !json_is_integer(id_obj)) { fprintf(stderr, "json error: get id error\n"); return -1; } if(!name_obj || !json_is_string(name_obj)) { fprintf(stderr, "json error: get name error\n"); return -1; } if(!age_obj || !json_is_integer(age_obj)) { fprintf(stderr, "json error: get age error\n"); return -1; } p->id = json_integer_value(id_obj); strcpy(p->name, json_string_value(name_obj)); p->age = json_integer_value(age_obj); json_decref(root); return 0; } int main() { char json_str[] = "{\"id\": 123, \"name\": \"Tom\", \"age\": 20}"; Person p; int ret = parse_person(json_str, &p); if(ret == 0) { printf("id=%d, name=%s, age=%d\n", p.id, p.name, p.age); } return 0; }
在上面的代碼中,我們使用了jansson庫來解析json數(shù)據(jù)。通過json_loads函數(shù),我們將json數(shù)據(jù)解析成了一個json_t類型的對象。接著,我們通過json_object_get函數(shù)來獲取json對象中的id、name和age三個屬性,最后將屬性值賦給Person結(jié)構(gòu)體中對應(yīng)的成員變量。需要注意的是,在使用完json_t對象后,需要通過json_decref函數(shù)將其釋放。