C語言作為一種底層的語言,無法像現代高級語言那樣輕松地解析JSON字符串。但是在解析JSON字符串時,C語言并不是完全沒有優勢。主流的C語言解析JSON字符串的方法有兩種,一種是手動解析JSON字符串,即自己寫代碼逐個提取JSON對象中的元素;另一種是使用開源的JSON庫,例如cJSON。
在讀取JSON字符串之前,我們需要一個字符緩沖區來保存待處理的JSON字符串數據。在本例中,我們采用的字符緩沖區大小為1024個字符的字符數組。
char buffer[1024];
在讀取完JSON字符串并放入緩沖區后,我們需要調用cJSON庫中的函數將它轉換成JSON對象。
cJSON *root = cJSON_Parse(buffer);
在解析JSON對象時,需要用到cJSON庫中的各種API函數,如cJSON_GetObjectItem等。以cJSON_GetObjectItem為例,它用于獲取JSON對象中的key-value字段。返回的數據類型為cJSON類型。
cJSON *name = cJSON_GetObjectItem(root, "name");
在將解析后的JSON對象存入數據庫中時,我們可以使用數據庫操作API,例如libpq(PostgreSQL官方的C庫)、MySQL C API等。
以下是一個完整的C程序示例,用于從JSON字符串中提取出用戶名和密碼,并將其存入PostgreSQL數據庫中。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <postgresql/libpq-fe.h> #include <cJSON/cJSON.h> int main(){ /* 連接數據庫 */ PGconn *conn = PQconnectdb("dbname=mydb user=myuser"); if (PQstatus(conn) != CONNECTION_OK) { fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn)); PQfinish(conn); exit(1); } /* JSON字符串緩沖區 */ char buffer[1024]; /* 讀取JSON字符串 */ fgets(buffer, 1024, stdin); /* 解析JSON字符串 */ cJSON *root = cJSON_Parse(buffer); /* 從JSON對象中獲取用戶名 */ cJSON *username = cJSON_GetObjectItem(root, "username"); /* 從JSON對象中獲取密碼 */ cJSON *password = cJSON_GetObjectItem(root, "password"); /* 將用戶名和密碼存入PostgreSQL數據庫中 */ char *sql = "INSERT INTO users(username, password) VALUES($1, $2);"; const char *params[2] = {cJSON_Print(username), cJSON_Print(password)}; int paramLengths[2] = {strlen(cJSON_Print(username)), strlen(cJSON_Print(password))}; int paramFormats[2] = {0, 0}; PGresult *res = PQexecParams(conn, sql, 2, NULL, params, paramLengths, paramFormats, 0); /* 檢查執行結果 */ if(PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "Insert failed: %s", PQerrorMessage(conn)); } else { printf("Inserted successfully."); } /* 釋放資源 */ cJSON_Delete(root); PQclear(res); PQfinish(conn); return 0; }