在開發過程中,我們經常需要向服務器發送json請求來獲取數據。C語言中有很多json解析庫,比如jansson、cJSON等。我們以cJSON為例來介紹如何發送json請求并解析返回的json數據。
首先,我們需要引用cJSON解析庫。可以使用以下命令安裝cJSON:
sudo apt-get install libjson-c-dev
發送json請求的過程大致可以分為以下幾步:
- 構造json數據
- 發送http請求
- 解析返回的json數據
下面我們來看一下詳細的實現過程。
構造json數據
首先,我們需要構造一個json數據格式的字符串。假設我們需要向服務器請求一個名為“test”的數據,我們可以使用以下代碼來構造json數據字符串:
char *json_string = cJSON_PrintUnformatted(cJSON_CreateObject());
cJSON_AddStringToObject(cJSON_GetObjectItem(json_string, ""), "data_name", "test");
這段代碼會生成一個如下結構的json字符串:
{"data_name":"test"}
發送http請求
向服務器發送http請求可以使用cURL庫。cURL是一個開源的庫,可以進行http通信,支持諸如HTTPS、FTP等多種協議,并且跨平臺,非常方便。
以下是發送json請求的示例代碼:
CURL *curl;
CURLcode res;
struct curl_slist *headers=NULL;
headers=curl_slist_append(headers, "Content-Type: application/json");
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/data");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_string);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
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);
}
在這段代碼中,我們設置了請求的URL和請求體。請求體中存放的就是之前構造的json數據字符串。此外,我們還設置了請求頭Content-Type為application/json。如果需要使用其他的請求頭,只需要將Content-Type替換成其他的即可。
解析返回的json數據
在獲取服務器返回的json數據后,我們需要解析它以獲得我們需要的數據。以下是一個簡單的解析代碼示例:
cJSON *root, *data_name;
root = cJSON_Parse(response);
if (root)
{
data_name = cJSON_GetObjectItem(root, "data_name");
if (cJSON_IsString(data_name) && (data_name->valuestring != NULL))
{
printf("data_name: %s\n", data_name->valuestring);
}
cJSON_Delete(root);
}
在這段代碼中,我們首先解析服務器返回的json數據,然后獲取其中的data_name元素。如果data_name元素存在且為字符串類型,我們就可以將其打印出來,即得到了我們需要的數據。
至此,我們已經完成了向服務器發送json請求并解析返回的json數據的過程。