在進(jìn)行網(wǎng)頁(yè)開(kāi)發(fā)的過(guò)程中,有時(shí)需要獲取網(wǎng)頁(yè)上的數(shù)據(jù),而一些網(wǎng)站提供了可供程序員調(diào)用的API,支持直接獲取數(shù)據(jù)。常見(jiàn)的返回?cái)?shù)據(jù)格式是JSON,而我們可以使用C語(yǔ)言獲取這些JSON數(shù)據(jù)。
{ "name": "張三", "age": 25, "gender": "male" }
以上是一個(gè)簡(jiǎn)單的JSON數(shù)據(jù)示例。下面介紹如何使用C語(yǔ)言獲取這個(gè)數(shù)據(jù)。
首先,我們需要使用CURL庫(kù)發(fā)送GET請(qǐng)求。代碼如下:
#include <stdio.h> #include <stdlib.h> #include <curl/curl.h> int main(int argc, char **argv) { CURL *curl; CURLcode res; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/data.json"); /* 向服務(wù)端發(fā)送GET請(qǐng)求,獲取返回的數(shù)據(jù) */ res = curl_easy_perform(curl); if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); curl_easy_cleanup(curl); } return 0; }
上面的代碼發(fā)送了一個(gè)GET請(qǐng)求,返回的數(shù)據(jù)可以通過(guò)以下方式獲取:
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, handle_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&json); curl_easy_perform(curl);
其中,handle_data是一個(gè)回調(diào)函數(shù),用來(lái)處理返回的數(shù)據(jù),實(shí)現(xiàn)方式如下:
int handle_data(void *ptr, size_t size, size_t nmemb, void *stream) { size_t realsize = size * nmemb; char *data = (char *)malloc(realsize + 1); if (data == NULL) return 0; memcpy(data, ptr, realsize); data[realsize] = '\0'; *((char**)stream) = data; return realsize; }
上面的代碼將返回的數(shù)據(jù)存儲(chǔ)到了json變量中。
最后,我們還需要使用JSON庫(kù)解析返回的數(shù)據(jù)。可以使用CJSON庫(kù)進(jìn)行解析,代碼如下:
cJSON *json = cJSON_Parse(data); if (!json) { printf("Error before: [%s]\n", cJSON_GetErrorPtr()); return 1; } printf("name: %s\nage: %d\ngender: %s\n", cJSON_GetObjectItem(json, "name")->valuestring, cJSON_GetObjectItem(json, "age")->valueint, cJSON_GetObjectItem(json, "gender")->valuestring);
至此,我們就使用C語(yǔ)言成功獲取了網(wǎng)頁(yè)上的JSON數(shù)據(jù),并且完成了解析。
上一篇vue3配置