如何连接数据库读取JSON:从基础到实践的完整指南
在当今数据驱动的开发场景中,JSON(JavaScript Object Notation)因轻量、易读、灵活的特性,已成为前后端数据交互的主流格式,而数据库作为数据存储的核心,如何高效连接数据库并读取JSON数据,成为开发者必备的技能,本文将以主流关系型数据库(如MySQL、PostgreSQL)和非关系型数据库(如MongoDB)为例,从基础概念到具体代码实践,详细拆解“连接数据库读取JSON”的全流程。
明确需求:为什么需要从数据库读取JSON?
在开始实践前,需先明确使用场景:
- 前后端分离:后端从数据库查询数据,以JSON格式返回给前端,便于前端直接解析渲染;
- 数据交换:跨系统/服务数据传输时,JSON作为通用格式,需从数据库读取并序列化为JSON;
- 配置存储:将系统配置(如规则、参数)以JSON格式存入数据库,运行时动态读取。
无论哪种场景,核心步骤均可概括为:连接数据库 → 执行查询 → 处理结果 → 转换为JSON。
准备工作:环境与工具安装
数据库选择与安装
- 关系型数据库:MySQL 8.0+、PostgreSQL 13+(支持JSON字段类型);
- 非关系型数据库:MongoDB 5.0+(原生存储JSON/BSON);
- 其他:Redis(可通过
JSON模块存储JSON,但更多用于缓存)。
以MySQL为例,需安装MySQL服务器并创建测试数据库/表:
CREATE DATABASE test_db;
USE test_db;
-- 创建包含JSON字段的表(MySQL 5.7+支持JSON类型)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
profile JSON -- 存储用户扩展信息(如地址、爱好等)
);
-- 插入测试数据
INSERT INTO users (name, profile) VALUES
('Alice', '{"age": 25, "city": "Beijing", "hobbies": ["reading", "coding"]}'),
('Bob', '{"age": 30, "city": "Shanghai", "hobbies": ["travel", "photography"]}');
开发环境与依赖安装
根据开发语言选择对应的数据库驱动/客户端库:
- Python:
pymysql(MySQL)、psycopg2(PostgreSQL)、pymongo(MongoDB); - Java:
mysql-connector-java(MySQL)、postgresql(PostgreSQL)、mongodb-driver-sync(MongoDB); - Node.js:
mysql2(MySQL)、pg(PostgreSQL)、mongodb(MongoDB); - PHP:
PDO(MySQL/PostgreSQL)、MongoDB PHP Library。
以Python为例,安装驱动:
pip install pymysql psycopg2 pymongo
核心步骤:连接数据库并读取JSON
场景1:关系型数据库(MySQL/PostgreSQL)读取JSON字段
关系型数据库(如MySQL)通过JSON类型存储JSON数据,需通过SQL查询获取字段值,再解析为JSON对象。
示例1:Python + MySQL 读取JSON字段
import pymysql
import json
# 1. 连接数据库
connection = pymysql.connect(
host='localhost',
user='root',
password='your_password',
database='test_db',
cursorclass=pymysql.cursors.DictCursor # 返回字典格式结果,便于JSON转换
)
try:
with connection.cursor() as cursor:
# 2. 执行查询(直接查询JSON字段)
sql = "SELECT id, name, profile FROM users"
cursor.execute(sql)
# 3. 获取结果(字典列表,已类似JSON结构)
results = cursor.fetchall()
# 4. 处理结果(可直接转换为JSON字符串)
json_data = json.dumps(results, ensure_ascii=False, indent=2)
print("原始JSON数据:")
print(json_data)
# 5. 解析JSON并提取字段(示例:提取Alice的年龄)
for user in results:
if user['name'] == 'Alice':
profile = user['profile'] # MySQL的JSON字段返回Python字典
print(f"\nAlice的年龄: {profile['age']}") # 通过键访问
finally:
connection.close()
关键点:
- 使用
DictCursor返回字典格式,避免手动转换字段名; profile字段在Python中自动解析为字典,无需额外json.loads();- 若需修改JSON字段(如添加键值),可通过
JSON_SET(MySQL)或jsonb_set(PostgreSQL)函数实现。
示例2:Node.js + PostgreSQL 读取JSON字段
const { Pool } = require('pg');
// 1. 连接数据库
const pool = new Pool({
user: 'postgres',
host: 'localhost',
database: 'test_db',
password: 'your_password',
port: 5432,
});
async function getUsers() {
try {
// 2. 执行查询
const res = await pool.query('SELECT id, name, profile FROM users');
// 3. 处理结果(PostgreSQL的JSON字段自动转为JavaScript对象)
const users = res.rows;
console.log("用户数据:", JSON.stringify(users, null, 2));
// 4. 提取Bob的城市
const bob = users.find(u => u.name === 'Bob');
console.log("\nBob的城市:", bob.profile.city);
} catch (err) {
console.error("查询错误:", err);
} finally {
await pool.end();
}
}
getUsers();
场景2:非关系型数据库(MongoDB)读取原生JSON
MongoDB原生存储JSON(BSON格式),查询结果可直接转换为JSON,无需额外字段类型处理。
示例:Python + MongoDB 读取JSON数据
from pymongo import MongoClient
import json
# 1. 连接MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['test_db'] # 数据库
collection = db['users'] # 集合(相当于MySQL的表)
# 2. 插入测试数据(若集合为空)
if collection.count_documents({}) == 0:
collection.insert_many([
{"name": "Alice", "profile": {"age": 25, "city": "Beijing", "hobbies": ["reading", "coding"]}},
{"name": "Bob", "profile": {"age": 30, "city": "Shanghai", "hobbies": ["travel", "photography"]}}
])
# 3. 查询数据(返回字典列表)
cursor = collection.find({}, {"_id": 0}) # 排除MongoDB默认的_id字段
results = list(cursor) # 转换为列表
# 4. 转换为JSON字符串
json_data = json.dumps(results, ensure_ascii=False, indent=2)
print("MongoDB查询结果(JSON):")
print(json_data)
# 5. 关闭连接
client.close()
关键点:
- MongoDB的文档(Document)结构与JSON高度一致,查询结果可直接序列化;
- 通过
find()的第二个参数(投影)控制返回字段,如{"_id": 0}排除_id; - 若需复杂查询(如嵌套字段匹配),可使用
$elemMatch、$where等操作符。
场景3:关系型数据库查询结果转换为JSON(无JSON字段)
若数据库表为传统结构(无JSON字段),需将多列数据组合为JSON格式,常见于“行转列”场景。
示例:Java + MySQL 将查询结果转为JSON
import java.sql.*;
import org.json.JSONArray;
import org.json.JSONObject;
public class QueryToJson {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test_db?user=root&password=your_password";
try (Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, age, city FROM users")) {
JSONArray jsonArray = new JSONArray();
while (rs.next()) {
JSONObject user = new JSONObject();
user.put("id", rs.getInt("id"));
user.put("name", rs.getString("name"));
user.put("age", rs.getInt("age"));
user.put("city", rs.getString("city"));
jsonArray.put(user);
}
System.out.println("转换后的JSON:");
System.out.println(jsonArray.toString(2));
} catch (Exception e) {
e.printStackTrace();
}
}
}
关键点:
- 遍历
ResultSet,逐列取值并封装为JSON对象; - 使用



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