JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式。在處理數(shù)據(jù)傳輸時,可能會遇到非常大的 JSON 文件,因此需要使用一些技巧來解析這些大文件。
在 C 語言中,可以使用 json-c 庫來解析 JSON 文件。首先需要安裝 json-c 庫,在 Linux 下運行以下命令即可:
sudo apt-get install libjson-c-dev
接下來,需要使用 json-c 庫的 json-c/json.h 頭文件,并使用以下代碼片段來解析 JSON 文件:
#include <stdio.h> #include <json-c/json.h> void readJson(const char* filename) { printf("Start reading JSON file: %s\n", filename); FILE* fp; char* jsonStr; struct json_object* jsonObj; struct json_tokener* tokener = json_tokener_new(); int pageCount = 0; int bufferSize = 1024; int bytesRead = 0; fp = fopen(filename, "r"); if (fp == NULL) { printf("Error: Failed to open %s\n", filename); return; } jsonStr = (char*) malloc(bufferSize+1); while((bytesRead = fread(jsonStr+strlen(jsonStr), 1, bufferSize, fp)) >0) { struct json_object* jtemp = json_tokener_parse_ex(tokener, jsonStr, bytesRead+strlen(jsonStr)); if (tokener->err != json_tokener_success) { printf("Error: %s\n", json_tokener_error_desc(tokener->err)); json_tokener_reset(tokener); } else { jsonArray = json_object_get_array(jsonObj); printf("%d: %d", pageCount, json_array_length(jsonArray)); pageCount++; json_object_put(jtemp); } } fclose(fp); json_tokener_free(tokener); free(jsonStr); printf("End reading JSON file\n"); }
可以看到,代碼中的 while 循環(huán)讀取 JSON 文件的內(nèi)容,json_tokener_parse_ex 函數(shù)在讀取完整個 JSON 對象之前返回 NULL。在讀取完整個 JSON 對象后,代碼使用 json_object_get_array 函數(shù)獲取 JSON 數(shù)組,并使用 json_array_length 函數(shù)獲取此數(shù)組中的元素數(shù)。
這樣,就可以快速解析超大的 JSON 文件了。