在進(jìn)行web開(kāi)發(fā)時(shí),我們通常需要通過(guò)http請(qǐng)求獲取數(shù)據(jù)。而json格式的數(shù)據(jù)已經(jīng)成為了現(xiàn)在web開(kāi)發(fā)中最流行的數(shù)據(jù)格式之一。如何在c語(yǔ)言中使用http請(qǐng)求獲取json數(shù)組數(shù)據(jù)呢?
我們可以使用c語(yǔ)言中的curl庫(kù)來(lái)進(jìn)行http請(qǐng)求,然后使用json-c庫(kù)來(lái)解析json數(shù)據(jù)。
#include <stdio.h> #include <stdlib.h> #include <curl/curl.h> #include <json-c/json.h> int main() { // 初始化curl curl_global_init(CURL_GLOBAL_ALL); // 創(chuàng)建curl句柄 CURL *curl = curl_easy_init(); if (curl) { // 設(shè)置請(qǐng)求地址和參數(shù) char *url = "http://example.com/data.json"; curl_easy_setopt(curl, CURLOPT_URL, url); // 設(shè)置請(qǐng)求頭 struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Accept: application/json"); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); // 執(zhí)行請(qǐng)求 CURLcode res = curl_easy_perform(curl); // 解析json數(shù)組 struct json_object *root_obj; root_obj = json_tokener_parse(response.memory); int length = json_object_array_length(root_obj); for (int i = 0; i < length; i++) { struct json_object *obj = json_object_array_get_idx(root_obj, i); printf("id: %d, name: %s\n", json_object_get_int(json_object_object_get(obj, "id")), json_object_get_string(json_object_object_get(obj, "name"))); } // 釋放資源 json_object_put(root_obj); curl_slist_free_all(headers); free(response.memory); curl_easy_cleanup(curl); } // 清理curl curl_global_cleanup(); return 0; }
以上代碼中,我們使用了curl_easy_setopt函數(shù)來(lái)設(shè)置請(qǐng)求參數(shù)。其中,CURLOPT_URL設(shè)置請(qǐng)求地址,CURLOPT_HTTPHEADER設(shè)置請(qǐng)求頭,CURLOPT_WRITEFUNCTION和CURLOPT_WRITEDATA用來(lái)設(shè)置請(qǐng)求回調(diào)函數(shù)和回調(diào)參數(shù)。
我們使用json_tokener_parse函數(shù)來(lái)解析json數(shù)組數(shù)據(jù),然后使用json_object_array_length和json_object_array_get_idx函數(shù)來(lái)遍歷數(shù)組元素,并使用json_object_get_int和json_object_get_string來(lái)獲取元素的屬性值。
使用curl和json-c庫(kù),我們可以方便地在c語(yǔ)言中實(shí)現(xiàn)http請(qǐng)求獲取json數(shù)組數(shù)據(jù)。