在C語(yǔ)言中,如果需要從服務(wù)器端獲取JSON數(shù)據(jù),可以使用一些第三方庫(kù)來(lái)輔助實(shí)現(xiàn)。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <curl/curl.h> #include <jansson.h> size_t writefunc(void *ptr, size_t size, size_t nmemb, char **s) { size_t new_len = *s ? strlen(*s) : 0; new_len += size * nmemb; *s = realloc(*s, new_len + 1); if (*s == NULL) { exit(EXIT_FAILURE); } memcpy(*s + new_len - (size * nmemb), ptr, size * nmemb); (*s)[new_len] = '\0'; return size * nmemb; } int main(void) { CURL *curl; CURLcode res; char *response = NULL; curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts/1"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); 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); } json_error_t json_error; json_t * root; root = json_loads(response, 0, &json_error); if (!root) { fprintf(stderr, "error: on line %d: %s\n", json_error.line, json_error.text); return 1; } int id = json_integer_value(json_object_get(root, "id")); char *title = json_string_value(json_object_get(root, "title")); printf("id: %d\n", id); printf("title: %s\n", title); free(response); json_decref(root); return 0; }
以上代碼使用了libcurl和jansson兩個(gè)庫(kù)來(lái)獲取JSON數(shù)據(jù)并解析。在writefunc函數(shù)中,我們使用realloc來(lái)擴(kuò)展response緩存,在curl_easy_setopt中設(shè)置CURLOPT_WRITEFUNCTION和CURLOPT_WRITEDATA來(lái)將數(shù)據(jù)寫入到response中。
同時(shí),我們使用json_loads函數(shù)來(lái)將JSON字符串轉(zhuǎn)化為json_t對(duì)象,并使用json_object_get來(lái)獲取其中某個(gè)字段的值。
需要注意的是,free(response)將response緩存釋放,json_decref(root)將json_t對(duì)象釋放。