在使用c語言進行json解析時,我們通常會將解析的數據存儲到一些預定義的變量中。然而,在一些需要動態生成變量的場景下,不同類型的變量也可能會導致我們的代碼冗長不堪,不易維護。這時候,將json數據轉換成c語言對應的var實體,就成為了一個相對優秀的解決方案。
typedef enum { VAR_INT = 0, VAR_FLOAT, VAR_BOOL, VAR_STRING, VAR_OBJECT, VAR_ARRAY, VAR_NULL } var_type; typedef struct var var; struct var { var_type type; union { int i; float f; bool b; char* s; struct { var* kv; int len; } o; struct { var* a; int len; } arr; } u; };
以上便是我們定義的var結構體,其中,type代表變量的類型。而u則存儲了對應類型的變量。
而在進行json解析時,我們的主要工作就是將json數據的各個節點轉換成對應的var實體。下面以字符串類型為例演示其基礎實現。
var* var_new_str(char* str) { var* v = (var*)malloc(sizeof(var)); v->type = VAR_STRING; v->u.s = (char*)malloc(strlen(str) + 1); strcpy(v->u.s, str); return v; }
以上就是將字符串類型轉換成var實體的基礎實現。實現過程中,我們需要申請新的var實體內存,并將type設置為VAR_STRING。同時,我們還需要為u.s申請新的內存,并將輸入的str拷貝到其中。
當然,對于數組或對象類型的轉換實現,其實現方式和拓展都將更加復雜。但在轉換實現完成后,我們的代碼將變得更加簡潔,處理起動態生成變量的場景時也會更加得心應手。
上一篇python 運算符%