在C語言中解析嵌套JSON數據可能會比較困難。但是,通過使用現成的JSON庫和遞歸解析的技巧,可以輕松地解析出復雜的JSON數據。
#include <stdio.h> #include <jansson.h> void print_json(json_t *root, int indent); void print_value(json_t *root, int indent) { switch (json_typeof(root)) { case JSON_OBJECT: // 處理JSON對象 print_json(root, indent); break; case JSON_ARRAY: // 處理JSON數組 for (size_t i = 0; i < json_array_size(root); i++) { print_value(json_array_get(root, i), indent + 1); } break; default: // 處理JSON值 printf("%*s", indent * 2, ""); // 打印縮進 switch (json_typeof(root)) { case JSON_STRING: printf("string: %s\n", json_string_value(root)); break; case JSON_INTEGER: printf("integer: %lld\n", json_integer_value(root)); break; case JSON_REAL: printf("real: %f\n", json_real_value(root)); break; case JSON_TRUE: printf("true\n"); break; case JSON_FALSE: printf("false\n"); break; case JSON_NULL: printf("null\n"); break; default: break; } break; } } void print_json(json_t *root, int indent) { printf("%*s{\n", indent * 2, ""); const char *key; json_t *value; json_object_foreach(root, key, value) { // 遍歷JSON對象 printf("%*s%s: ", indent * 2, "", key); print_value(value, indent + 1); } printf("%*s}\n", indent * 2, ""); } int main() { const char *json_str = "{\"name\":\"小明\",\"age\":18,\"friends\":[{\"name\":\"小紅\",\"age\":17}," "{\"name\":\"小蘭\",\"age\":18}],\"score\":{\"math\":90,\"english\":85}}"; json_t *root; json_error_t error; root = json_loads(json_str, 0, &error); // 加載JSON字符串 print_json(root, 0); // 打印JSON對象 json_decref(root); // 釋放JSON對象 return 0; }
在上面的代碼中,我們使用了jansson庫來解析JSON數據。我們定義了兩個函數:print_value和print_json。函數print_value用于處理JSON值,而函數print_json用于處理JSON對象。在print_json函數中,我們使用了json_object_foreach來遍歷JSON對象中的所有鍵值對,并調用print_value函數來遞歸地解析JSON數據。
在main函數中,我們定義了一個JSON字符串,并使用json_loads函數將其加載為JSON對象。然后,我們使用print_json函數打印JSON對象,并最后釋放JSON對象。
上一篇data循環json