C與JSON都是非常常見的編程語言和數據格式,但是在使用C解析JSON時我們需要面對一個特殊的問題,那就是C語言沒有實體類的概念。
在其他支持面向對象語言中,JSON和實體類之間可以很方便的相互轉換,因為實體類可以很好地反映JSON中的數據結構。但是在C語言中,我們需要手動解析JSON,并利用C語言自身的數據結構和函數進行處理。
#include#include #include #include typedef struct { char* key; void* value; } Json; bool is_json_object(char* s) { return s[0] == '{' && s[strlen(s) - 1] == '}'; } Json* parse_json_object(char* s) { Json* json = malloc(sizeof(Json)); char* key = strtok(s, ":"); char* value = strtok(NULL, ""); // Remove double quotes from key key++; key[strlen(key) - 1] = '\0'; if (is_json_object(value)) { // Parse nested JSON object json->key = key; json->value = parse_json_object(value); } else { // Convert string value to specified type (int or float) json->key = key; if (strchr(value, '.') != NULL) { json->value = malloc(sizeof(float)); *((float*)json->value) = atof(value); } else { json->value = malloc(sizeof(int)); *((int*)json->value) = atoi(value); } } return json; } int main() { char* s = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; if (is_json_object(s)) { Json* json = parse_json_object(s); // Access value by key int age = *((int*)json->value); printf("Name: %s\nAge: %d\n", (char*)json->value, age); free(json->key); free(json->value); free(json); } return 0; }
上述例子展示了如何處理一個簡單的JSON對象,我們通過手動解析JSON字符串,將其轉換為C語言中的結構體和指針,進行訪問和處理。使用類似的方法,我們也可以處理JSON數組和復雜的嵌套結構。
雖然在C語言中沒有實體類的概念,但是我們仍然可以通過手動解析,并運用C語言的強大數據處理能力,對各種復雜的數據結構進行解析和處理。