如何将数据库查询的数据转换为JSON格式:实用指南与代码示例
在当今的Web开发、数据交换和API设计中,JSON(JavaScript Object Notation)已成为最主流的数据交换格式——它轻量、易读、易于机器解析,且与JavaScript原生兼容,而数据库作为数据存储的核心,其查询结果(如关系型数据库的表数据、非关系型数据库的文档数据)往往需要转换为JSON格式,才能被前端应用、API接口或其他系统直接使用,本文将详细介绍将数据库查询数据转换为JSON的多种方法,涵盖不同编程语言、数据库工具及场景,并提供具体代码示例。
为什么需要将数据库查询结果转为JSON?
在方法之前,先明确转换的必要性:
- API接口数据格式:RESTful API要求返回JSON格式数据,前端通过AJAX或Fetch直接解析;
- 前后端分离:后端数据库查询结果需以JSON形式传递给前端,实现数据解耦;
- 数据交换:不同系统(如Java应用与Python应用)通过JSON交换数据,避免语言/框架差异;
- 缓存与存储:JSON可轻松存入Redis、MongoDB等NoSQL数据库,或作为文件缓存(如
.json文件)。
核心方法:从数据库查询到JSON的转换路径
无论使用何种技术栈,转换的核心逻辑可概括为:
数据库查询 → 获取数据集(如ResultSet、游标)→ 遍历数据集 → 构建JSON结构 → 序列化为JSON字符串
下面分场景介绍具体实现方法。
方法1:使用编程语言原生API(通用且灵活)
这是最常用的方法,通过后端语言(如Python、Java、PHP等)执行SQL查询,手动或自动将结果转为JSON。
示例1:Python(pymysql + json库)
Python的pymysql库连接MySQL,查询结果通过cursor.fetchall()获取,再用json.dumps()序列化。
import pymysql
import json
# 1. 连接数据库
connection = pymysql.connect(
host='localhost',
user='root',
password='password',
database='test_db'
)
try:
with connection.cursor() as cursor:
# 2. 执行查询
sql = "SELECT id, name, age, email FROM users WHERE age > 20"
cursor.execute(sql)
# 3. 获取结果(列表形式,每个元素是元组)
results = cursor.fetchall()
# 4. 转换为JSON兼容格式(元组转字典)
data = []
for row in results:
data.append({
'id': row[0],
'name': row[1],
'age': row[2],
'email': row[3]
})
# 5. 序列化为JSON字符串
json_data = json.dumps(data, ensure_ascii=False, indent=4)
print(json_data)
finally:
connection.close()
优化点:若数据库表字段与字典键名一致,可通过cursor.description获取字段名,避免手动映射:
# 获取字段名
columns = [column[0] for column in cursor.description]
data = []
for row in results:
data.append(dict(zip(columns, row))) # 元组+字段名转字典
示例2:Java(JDBC + Jackson/Gson)
Java通过JDBC查询数据库,结果集(ResultSet)需手动转为JSON,常用Jackson或Gson库简化操作。
import java.sql.*;
import com.fasterxml.jackson.databind.ObjectMapper;
public class DatabaseToJson {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test_db";
String user = "root";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, age, email FROM users WHERE age > 20")) {
// 使用Jackson将ResultSet转为JSON
ObjectMapper mapper = new ObjectMapper();
// ResultSet需要先转为List<Map>或自定义对象
mapper.writeValue(System.out, rs);
} catch (Exception e) {
e.printStackTrace();
}
}
}
补充:若使用Spring Boot,可通过JdbcTemplate简化查询,再结合@ResponseBody自动转为JSON:
@RestController
public class UserController {
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping("/users")
public List<Map<String, Object>> getUsers() {
return jdbcTemplate.queryForList("SELECT id, name, age, email FROM users WHERE age > 20");
}
}
示例3:PHP(PDO + json_encode)
PHP原生支持JSON转换,通过PDO查询数据库后,直接用json_encode将数组转为JSON。
<?php
$host = 'localhost';
$dbname = 'test_db';
$user = 'root';
$pass = 'password';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->query("SELECT id, name, age, email FROM users WHERE age > 20");
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); // 直接获取关联数组
$json_data = json_encode($results, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $json_data;
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
关键:PDO::FETCH_ASSOC确保结果为关联数组(键名为字段名),便于json_encode直接处理。
方法2:使用数据库内置功能(高效且减少代码)
部分数据库(如PostgreSQL、MySQL 8.0+、MongoDB)支持直接将查询结果转为JSON,减少后端处理开销。
示例1:MySQL 8.0+(JSON_ARRAYAGG/JSON_OBJECT)
MySQL 8.0+提供了JSON函数,可直接在SQL查询中生成JSON数据。
-- 单行转JSON对象
SELECT JSON_OBJECT('id', id, 'name', name, 'age', age, 'email', email)
FROM users WHERE id = 1;
-- 多行转JSON数组
SELECT JSON_ARRAYAGG(JSON_OBJECT('id', id, 'name', name, 'age', age, 'email', email))
FROM users WHERE age > 20;
后端调用(Python示例):
import pymysql
import json
connection = pymysql.connect(
host='localhost',
user='root',
password='password',
database='test_db'
)
try:
with connection.cursor() as cursor:
# 直接执行JSON函数查询
sql = """
SELECT JSON_ARRAYAGG(JSON_OBJECT('id', id, 'name', name, 'age', age, 'email', email))
FROM users WHERE age > 20
"""
cursor.execute(sql)
result = cursor.fetchone()[0] # 获取JSON字符串
print(result) # 输出:[{"id":1,"name":"Alice","age":25,"email":"alice@example.com"}, ...]
finally:
connection.close()
示例2:PostgreSQL(:json/to_jsonb)
PostgreSQL支持直接将查询结果转为JSON或JSONB(二进制JSON)。
-- 单行转JSON SELECT to_jsonb(users) FROM users WHERE id = 1; -- 多行转JSON数组 SELECT json_agg(to_jsonb(users)) FROM users WHERE age > 20;
后端调用(Java示例):
try (Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost/test_db", "user", "password");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT json_agg(to_jsonb(users)) FROM users WHERE age > 20")) {
if (rs.next()) {
String jsonData = rs.getString(1); // 直接获取JSON字符串
System.out.println(jsonData);
}
} catch (Exception e) {
e.printStackTrace();
}
示例3:MongoDB(原生JSON格式)
MongoDB是文档型数据库,数据本身以BSON(二进制JSON)存储,查询结果可直接转为JSON。
// 查询并转为JSON
db.users.find({ age: { $gt: 20 } }).pretty(); // pretty()格式化输出
// 或在Node.js中
const users = await db.collection('users').find({ age: { $gt: 20 } }).toArray();
const jsonData = JSON.stringify(users, null, 2);
console.log(jsonData);
方法3:使用ORM框架(自动化映射)
ORM(对象关系映射)框架(如Python的SQLAlchemy、Java的Hibernate、PHP的Doctrine)可将数据库表映射为对象,查询结果



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