c http json數據格式
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <curl/curl.h> #include <jansson.h> static size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) { size_t written = fwrite(ptr, size, nmemb, (FILE *) stream); return written; } int main(int argc, char **argv) { CURL *curl; CURLcode res; char *url = "https://api.github.com/repos/octocat/hello-world"; FILE *fp; char *filename = "response.json"; json_t *root; json_error_t error; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); fp = fopen(filename, "w"); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); res = curl_easy_perform(curl); curl_easy_cleanup(curl); fclose(fp); } fp = fopen(filename, "r"); root = json_loadf(fp, 0, &error); if (!root) { fprintf(stderr, "error: on line %d: %s\n", error.line, error.text); return 1; } json_t *name = json_object_get(root, "name"); if (json_is_string(name)) { printf("Repository name: %s\n", json_string_value(name)); } json_t *owner = json_object_get(root, "owner"); if (json_is_object(owner)) { json_t *login = json_object_get(owner, "login"); if (json_is_string(login)) { printf("Owner's name: %s\n", json_string_value(login)); } } json_decref(root); curl_global_cleanup(); return 0; }
上述這段c代碼實現了使用c語言獲取Github API返回的json數據,并解析其中的name和owner項。
json數據格式在web開發中較為常用,它使用key-value的形式保存數據。在c語言中,我們可以使用第三方庫例如jansson來讀取和解析json數據。
在上述代碼中,先使用curl發送get請求,將返回的數據保存至文件中。接著用jansson庫中的json_loadf()函數加載json文件,接著從中獲取必要的信息。
值得注意的是,在使用完jansson的對象后應該調用json_decref()函數來釋放占用的內存。