JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。在C語言中,我們可以使用第三方庫來處理JSON數據。下面將介紹如何使用C語言獲取JSON數據。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#include <jansson.h>
// 回調函數
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) {
size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
return written;
}
int main() {
CURL *curl;
CURLcode res;
FILE *fp;
char *url = "https://api.example.com/data.json";
char outfilename[FILENAME_MAX] = "data.json";
curl = curl_easy_init();
if (curl) {
fp = fopen(outfilename,"wb");
// 設置URL
curl_easy_setopt(curl, CURLOPT_URL, url);
// 設置回調函數
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
// 設置寫入文件流
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
// 執行請求
res = curl_easy_perform(curl);
// 關閉文件流
fclose(fp);
// 檢查結果
if (res != CURLE_OK) {
printf("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
else {
// 解析JSON數據
json_t *root;
json_error_t error;
char *json_string;
fp = fopen(outfilename,"rb");
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fseek(fp, 0, SEEK_SET);
json_string = (char*)malloc(size+1);
fread(json_string, 1, size, fp);
fclose(fp);
json_string[size] = '\0';
root = json_loads(json_string, 0, &error);
if (!root) {
printf("json error on line %d: %s\n", error.line, error.text);
}
else {
// 處理JSON數據
json_t *data = json_object_get(root, "data");
int data_len = json_array_size(data);
for(int i=0;i<data_len;i++) {
json_t *item = json_array_get(data, i);
char *name = json_string_value(json_object_get(item, "name"));
int age = json_integer_value(json_object_get(item, "age"));
printf("Name:%s Age:%d\n", name, age);
}
}
// 釋放內存
json_decref(root);
free(json_string);
}
// 清理
curl_easy_cleanup(curl);
}
return 0;
}
上述代碼使用了libcurl和jansson兩個第三方庫,前者用于發送HTTP請求,后者用于處理JSON數據。具體步驟為:
- 使用libcurl庫發送GET請求,將獲取到的JSON數據保存到文件中
- 使用jansson庫解析JSON數據,獲取到需要的數據
- 關閉文件流,釋放內存
通過上述方法,我們可以在C語言中方便地獲取和處理JSON數據。需要注意的是,由于JSON數據的格式多種多樣,針對不同的數據格式可能需要使用不同的解析方法,具體可以參考jansson的文檔。