在C語言中,自制解析JSON是一項非常基礎、重要的技能。JSON是一種輕量級的數據交換格式,因此在數據的處理中經常會用到。下面通過示例,介紹如何在C語言中自制解析JSON。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <jansson.h> int parse_json(char *json_string) { json_t *root = NULL; json_error_t error; size_t index; const char *key; json_t *value; root = json_loads(json_string, 0, &error); if (!root) { fprintf(stderr, "Error: on line %d: %s\n", error.line, error.text); return 1; } printf("JSON string:\n%s\n\n", json_string); printf("JSON object:\n%s\n\n", json_dumps(root, JSON_INDENT(4))); if (!json_is_object(root)) { fprintf(stderr, "Error: root is not an object\n"); json_decref(root); return 1; } json_object_foreach(root, key, value) { printf("key=%s\n", key); switch (json_typeof(value)) { case JSON_OBJECT: printf("value = object\n"); break; case JSON_ARRAY: printf("value = array\n"); break; case JSON_STRING: printf("value = %s\n", json_string_value(value)); break; case JSON_INTEGER: printf("value = %ld\n", json_integer_value(value)); break; case JSON_REAL: printf("value = %f\n", json_real_value(value)); break; case JSON_TRUE: printf("value = true\n"); break; case JSON_FALSE: printf("value = false\n"); break; case JSON_NULL: printf("value = null\n"); break; default: fprintf(stderr, "Error: unknown JSON type\n"); json_decref(root); return 1; } } json_decref(root); return 0; } int main(int argc, char *argv[]) { char *json_string = "{ \"name\":\"John Smith\", \"age\":33, \"email\":\"john.smith@mail.com\" }"; parse_json(json_string); return 0; }
上述代碼實現了一個簡單的JSON解析器,可以將JSON字符串解析成一個JSON對象,并列出其中各個key-value對的值。
其中,使用了jansson這個JSON解析庫,需要將其頭文件和庫文件加入項目中。首先,通過調用json_loads()函數將JSON字符串加載成一個JSON對象,通過判斷root是否為一個object來確定是否解析成功。
接著,通過json_object_foreach()函數遍歷JSON對象中的每個鍵值對,再通過json_typeof()函數判斷值的類型,并打印出其值。
通過以上簡單介紹,你可以初步了解如何在C語言中自制JSON解析器,并將JSON字符串解析成一個JSON對象。