使用C语言通过JSON操作数据库的实践指南
在C语言开发中,处理JSON数据并与数据库交互是常见需求,从API接收JSON格式的请求参数,解析后存入数据库;或将数据库查询结果序列化为JSON返回给客户端,本文将详细介绍如何使用C语言通过JSON库操作数据库,涵盖环境搭建、JSON解析、数据库连接、数据交互及完整示例。
开发环境准备
必需工具与库
- C语言编译器:GCC(Linux/macOS)或MinGW(Windows)
- JSON库:选择轻量级且易用的库,常用
cJSON(推荐,单头文件/源码,无需额外依赖) - 数据库连接库:根据数据库类型选择,如
libpq(PostgreSQL)、mysqlclient(MySQL)、SQLite3(SQLite,无需额外安装,自带驱动)
环境安装
以Linux(Ubuntu)为例:
# 安装GCC sudo apt update && sudo apt install gcc # 安装cJSON(从源码编译) git clone https://github.com/DaveGamble/cJSON.git cd cJSON mkdir build && cd build cmake .. && make sudo make install # 安装到系统,头文件/usr/local/include/cJSON.h,库文件/usr/local/lib/libcjson.so # 安装PostgreSQL开发库(以PostgreSQL为例) sudo apt install libpq-dev
Windows环境下可从cJSON官网下载预编译库,或使用vcpkg包管理器安装:vcpkg install cJSON libpq。
核心流程概述
C语言通过JSON操作数据库的核心流程分为四步:
- JSON解析:将JSON字符串解析为C语言可操作的数据结构(如cJSON对象)。
- 数据提取:从JSON结构中获取目标字段(如用户名、密码等)。
- 数据库交互:建立数据库连接,执行SQL语句(插入/查询/更新等)。
- 结果处理:将数据库查询结果序列化为JSON(可选),或返回操作状态。
详细步骤实现
JSON解析与数据提取(以cJSON为例)
cJSON通过树形结构表示JSON数据,核心API包括:
cJSON_Parse():解析JSON字符串为cJSON对象。cJSON_GetObjectItem():根据键名获取子对象。cJSON_IsString()/cJSON_IsNumber():判断数据类型并获取值。
示例:解析用户注册JSON
假设接收到的JSON字符串为:
{"username":"testuser","password":"123456","email":"test@example.com"}
解析代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"
int parse_json_data(const char *json_str) {
// 1. 解析JSON字符串
cJSON *root = cJSON_Parse(json_str);
if (!root) {
printf("JSON解析失败: %s\n", cJSON_GetErrorPtr());
return -1;
}
// 2. 获取字段值
cJSON *username = cJSON_GetObjectItem(root, "username");
cJSON *password = cJSON_GetObjectItem(root, "password");
cJSON *email = cJSON_GetObjectItem(root, "email");
if (!cJSON_IsString(username) || !cJSON_IsString(password) || !cJSON_IsString(email)) {
printf("JSON字段类型错误\n");
cJSON_Delete(root);
return -1;
}
// 3. 提取数据
const char *user = username->valuestring;
const char *pass = password->valuestring;
const char *mail = email->valuestring;
printf("用户名: %s, 密码: %s, 邮箱: %s\n", user, pass, mail);
// 4. 释放内存(重要!避免内存泄漏)
cJSON_Delete(root);
return 0;
}
int main() {
const char *json_str = "{\"username\":\"testuser\",\"password\":\"123456\",\"email\":\"test@example.com\"}";
parse_json_data(json_str);
return 0;
}
编译运行(需链接cJSON库):
gcc -o json_parse json_parse.c -lcjson ./json_parse
数据库连接与操作(以PostgreSQL为例)
使用libpq库连接PostgreSQL,核心API包括:
PQconnectdb():连接数据库。PQexec():执行SQL语句。PQresultStatus():检查执行结果。PQclear():释放结果集。
示例:创建表并插入数据
#include <libpq-fe.h>
#include <stdio.h>
#include <stdlib.h>
// 连接数据库并执行插入
int insert_to_database(const char *user, const char *pass, const char *email) {
PGconn *conn = PQconnectdb("dbname=test user=postgres password=123456 host=localhost");
if (PQstatus(conn) != CONNECTION_OK) {
fprintf(stderr, "数据库连接失败: %s", PQerrorMessage(conn));
PQfinish(conn);
return -1;
}
// 构建SQL语句(防止SQL注入,使用参数化查询)
const char *paramValues[3];
paramValues[0] = user;
paramValues[1] = pass;
paramValues[2] = email;
const char *query = "INSERT INTO users (username, password, email) VALUES ($1, $2, $3)";
PGresult *res = PQexecParams(conn, query, 3, NULL, paramValues, NULL, NULL, 0);
if (PQresultStatus(res) != PGRES_COMMAND_OK) {
fprintf(stderr, "插入失败: %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return -1;
}
printf("数据插入成功\n");
PQclear(res);
PQfinish(conn);
return 0;
}
int main() {
insert_to_database("testuser", "123456", "test@example.com");
return 0;
}
编译运行(需链接libpq):
gcc -o db_insert db_insert.c -lpq ./db_insert
整合:JSON解析 + 数据库操作
将上述两步结合,实现“解析JSON并插入数据库”的完整流程,假设JSON数据来自文件或网络请求,这里以硬编码字符串为例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"
#include <libpq-fe.h>
// 解析JSON并插入数据库
int json_to_database(const char *json_str) {
// 1. 解析JSON
cJSON *root = cJSON_Parse(json_str);
if (!root) {
fprintf(stderr, "JSON解析失败: %s\n", cJSON_GetErrorPtr());
return -1;
}
cJSON *username = cJSON_GetObjectItem(root, "username");
cJSON *password = cJSON_GetObjectItem(root, "password");
cJSON *email = cJSON_GetObjectItem(root, "email");
if (!cJSON_IsString(username) || !cJSON_IsString(password) || !cJSON_IsString(email)) {
fprintf(stderr, "JSON字段类型错误\n");
cJSON_Delete(root);
return -1;
}
const char *user = username->valuestring;
const char *pass = password->valuestring;
const char *mail = email->valuestring;
// 2. 连接数据库并插入
PGconn *conn = PQconnectdb("dbname=test user=postgres password=123456 host=localhost");
if (PQstatus(conn) != CONNECTION_OK) {
fprintf(stderr, "数据库连接失败: %s", PQerrorMessage(conn));
cJSON_Delete(root);
PQfinish(conn);
return -1;
}
const char *paramValues[3] = {user, pass, mail};
const char *query = "INSERT INTO users (username, password, email) VALUES ($1, $2, $3)";
PGresult *res = PQexecParams(conn, query, 3, NULL, paramValues, NULL, NULL, 0);
if (PQresultStatus(res) != PGRES_COMMAND_OK) {
fprintf(stderr, "插入失败: %s", PQerrorMessage(conn));
cJSON_Delete(root);
PQclear(res);
PQfinish(conn);
return -1;
}
printf("用户 %s 数据插入成功\n", user);
cJSON_Delete(root);
PQclear(res);
PQfinish(conn);
return 0;
}
int main() {
const char *json_str = "{\"username\":\"json_user\",\"password\":\"654321\",\"email\":\"json@test.com\"}";
json_to_database(json_str);
return 0;
}
编译运行:
gcc -o json_db json_db.c -lcjson -lpq ./json_db



还没有评论,来说两句吧...