如何将表数据转成JSON字符串:从基础到实践的全面指南
在现代软件开发中,JSON(JavaScript Object Notation)已成为数据交换的主流格式,因其轻量级、易读、易解析的特性,被广泛应用于前后端数据交互、API响应、配置文件存储等场景,而“表数据”(如数据库表、Excel表格、程序中的二维表格等)作为结构化数据的常见载体,将其转换为JSON字符串是开发者常需面对的任务,本文将系统介绍表数据转JSON的核心方法、不同场景下的实践技巧及注意事项,帮助 you 快速这一技能。
理解表数据与JSON的基本结构
在转换之前,需先明确两种数据结构的对应关系:
- 表数据:通常由“行”(记录)和“列”(字段)组成,例如数据库表中的每一行是一条记录,列名是字段名,单元格值是字段值。
- JSON:核心是键值对(Key-Value)结构,可通过对象()表示单条记录(键为字段名,值为字段值),用数组(
[]})存储多条记录(对象集合)。
数据库中的表 users:
| id | name | age | |
|---|---|---|---|
| 1 | Alice | 25 | alice@example.com |
| 2 | Bob | 30 | bob@example.com |
转换为JSON后,典型结果为:
[
{"id": 1, "name": "Alice", "age": 25, "email": "alice@example.com"},
{"id": 2, "name": "Bob", "age": 30, "email": "bob@example.com"}
]
常见场景下的转换方法
数据库表数据转JSON(SQL场景)
从数据库查询结果直接生成JSON,是后端开发中的高频需求,主流数据库(如MySQL、PostgreSQL、SQL Server)均内置了JSON生成函数。
(1)MySQL 5.7+:使用 JSON_ARRAYAGG 和 JSON_OBJECT
SELECT
JSON_ARRAYAGG(
JSON_OBJECT(
'id', id,
'name', name,
'age', age,
'email', email
)
) AS users_json
FROM users;
JSON_OBJECT(key1, value1, key2, value2, ...):将列名和值转换为JSON对象。JSON_ARRAYAGG(...):将多个JSON对象聚合成JSON数组。
(2)PostgreSQL:使用 json_agg 和 to_jsonb
SELECT
json_agg(
jsonb_build_object(
'id', id,
'name', name,
'age', age,
'email', email
)
) AS users_json
FROM users;
jsonb_build_object:构建JSONB(二进制JSON,支持更多操作)对象。json_agg:聚合为JSON数组。
(3)SQL Server:使用 FOR JSON PATH
SELECT
id, name, age, email
FROM users
FOR JSON PATH, ROOT('users');
FOR JSON PATH:按路径格式生成JSON(列名自动作为键)。ROOT('users'):为JSON数组添加根节点(可选)。
(4)Python + SQLAlchemy:通过ORM查询后转换
若使用Python的SQLAlchemy ORM,可先查询为字典列表,再序列化为JSON:
from sqlalchemy import create_engine, text
import json
# 创建数据库连接
engine = create_engine('mysql+pymysql://user:password@localhost/db_name')
# 查询数据并转换为字典列表
with engine.connect() as conn:
result = conn.execute(text("SELECT id, name, age, email FROM users"))
data = [dict(row._mapping) for row in result] # 将行映射为字典
# 转换为JSON字符串
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)
Excel/CSV表格数据转JSON(办公场景)
处理Excel或CSV文件时,可通过工具或代码实现转换。
(1)手动转换(小数据量)
- Excel:选中数据区域 → 点击“文件”→“另存为”→ 选择“JSON(*.json)”格式(需Excel 2016+支持)。
- CSV:打开CSV文件,复制数据 → 使用在线工具(如CSVJSON)或代码转换。
(2)Python + Pandas:批量转换(推荐)
Pandas提供了强大的表格处理能力,可轻松将DataFrame转为JSON:
import pandas as pd
# 读取Excel或CSV文件
df = pd.read_excel('users.xlsx') # 或 pd.read_csv('users.csv')
# 转换为JSON字符串(orient='records'按行转为对象数组)
json_str = df.to_json(orient='records', force_ascii=False, indent=2)
print(json_str)
# 保存到文件
with open('users.json', 'w', encoding='utf-8') as f:
f.write(json_str)
orient='records':关键参数,生成对象数组格式(默认为orient='columns',生成键为列名的对象)。force_ascii=False:支持非ASCII字符(如中文)。indent=2:格式化输出,提升可读性。
程序内存中的表数据转JSON(代码场景)
在代码中,若数据已存储为二维列表、字典列表等结构,可直接序列化为JSON。
(1)Python:使用 json 模块
import json
# 模拟表数据(字典列表,每行一个字典)
table_data = [
{"id": 1, "name": "Alice", "age": 25, "email": "alice@example.com"},
{"id": 2, "name": "Bob", "age": 30, "email": "bob@example.com"}
]
# 转换为JSON字符串
json_str = json.dumps(table_data, ensure_ascii=False, indent=2)
print(json_str)
json.dumps():将Python对象序列化为JSON字符串。ensure_ascii=False:避免中文被转义为\uXXXX。indent=2:缩进格式化,便于调试。
(2)JavaScript/Node.js:使用 JSON.stringify()
// 模拟表数据(对象数组)
const tableData = [
{id: 1, name: "Alice", age: 25, email: "alice@example.com"},
{id: 2, name: "Bob", age: 30, email: "bob@example.com"}
];
// 转换为JSON字符串
const jsonStr = JSON.stringify(tableData, null, 2); // null表示不过滤属性,2为缩进
console.log(jsonStr);
复杂表数据嵌套转换(关联表场景)
实际业务中,表数据常存在一对多、多对多关系(如用户表与订单表),需转换为嵌套JSON。
示例:用户表与订单表关联
用户表(users):
| id | name |
|-----|-------|
| 1 | Alice |
| 2 | Bob |
订单表(orders):
| id | user_id | product | price |
|-----|---------|---------|-------|
| 1 | 1 | "Laptop"| 5000 |
| 2 | 1 | "Mouse" | 100 |
| 3 | 2 | "Keyboard"| 300 |
目标JSON:
[
{
"id": 1,
"name": "Alice",
"orders": [
{"id": 1, "product": "Laptop", "price": 5000},
{"id": 2, "product": "Mouse", "price": 100}
]
},
{
"id": 2,
"name": "Bob",
"orders": [
{"id": 3, "product": "Keyboard", "price": 300}
]
}
]
转换方法(Python示例):
import json
from collections import defaultdict
# 模拟原始数据
users = [
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
orders = [
{"id": 1, "user_id": 1, "product": "Laptop", "price": 5000},
{"id": 2, "user_id": 1, "product": "Mouse", "price": 100},
{"id": 3, "user_id": 2, "product": "Keyboard", "price


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