JSON怎么读取数据库数据:从基础到实践的完整指南
在当今数据驱动的开发环境中,JSON(JavaScript Object Notation)因其轻量级、易读、易解析的特性,已成为数据交换的主流格式之一,而数据库作为数据存储的核心,如何高效地将数据库中的数据读取并以JSON格式返回,成为开发者必须的技能,本文将从“为什么用JSON读取数据库数据”出发,详细讲解不同数据库(关系型、非关系型)的JSON读取方法,并结合代码示例带你从入门到实践。
为什么选择JSON格式读取数据库数据?
在讨论“怎么读”之前,先明确“为什么读”,JSON格式之所以被广泛用于数据库数据交互,主要有三大优势:
- 轻量级与高效性:JSON相比XML更简洁,解析速度快,数据占用带宽少,尤其适合网络传输(如API接口返回数据)。
- 跨语言兼容性:JSON是JavaScript的原生格式,同时支持Python、Java、Go等几乎所有主流编程语言,便于不同系统间的数据互通。
- 结构化数据友好:JSON支持键值对、数组、嵌套对象等复杂结构,能灵活表达数据库中的关系型数据(如一对多、多对多关系)和非结构化数据(如文档、日志)。
基础知识:数据库数据与JSON的映射关系
要读取数据库数据并转为JSON,首先需理解数据库表/集合与JSON结构的对应关系:
| 数据库概念 | JSON概念 | 示例 |
|---|---|---|
| 表(Table) | 对象数组([]) |
多行数据转为[{...}, {...}, ...] |
| 行(Row/Record) | 对象() | 单行数据转为{"列名1": "值1", ...} |
| 列(Column) | 键值对("key": value) |
列名作为键,列值作为值 |
| 关联表(如外键) | 嵌套对象/数组 | 一对多关系转为嵌套数组,如{"orders": [...]} |
关系型数据库:MySQL/PostgreSQL的JSON读取方法
关系型数据库(如MySQL、PostgreSQL)通过SQL查询直接返回JSON结果,无需额外处理,核心是利用数据库内置的JSON函数(如JSON_ARRAYAGG、JSON_OBJECT)或设置查询结果格式为JSON。
MySQL:通过JSON_ARRAYAGG和JSON_OBJECT构建JSON
MySQL 5.7+原生支持JSON函数,可通过聚合函数将多行数据转为JSON数组。
示例场景:查询用户表users中的数据,并转为JSON数组格式。
-- 查询所有用户,转为JSON数组
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'id', id,
'name', name,
'email', email,
'created_at', created_at
)
) AS users_json
FROM users;
执行结果:
[
{"id": 1, "name": "张三", "email": "zhangsan@example.com", "created_at": "2023-01-01 10:00:00"},
{"id": 2, "name": "李四", "email": "lisi@example.com", "created_at": "2023-01-02 11:00:00"},
...
]
扩展:关联查询转为嵌套JSON
假设users表与orders表(用户订单)是一对多关系,需查询用户及其所有订单:
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'id', u.id,
'name', u.name,
'orders', (
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'order_id', o.id,
'amount', o.amount,
'order_date', o.order_date
)
)
FROM orders o
WHERE o.user_id = u.id
)
)
) AS users_with_orders
FROM users u;
结果:
[
{
"id": 1,
"name": "张三",
"orders": [
{"order_id": 101, "amount": 99.9, "order_date": "2023-02-01"},
{"order_id": 102, "amount": 149.9, "order_date": "2023-02-05"}
]
},
...
]
PostgreSQL:通过json_agg和to_json构建JSON
PostgreSQL对JSON的支持更完善,可通过json_agg(聚合为JSON数组)和to_json(将行转为JSON对象)实现。
示例场景:查询商品表products,转为JSON数组。
-- 查询所有商品,转为JSON数组
SELECT json_agg(
json_build_object(
'id', id,
'name', name,
'price', price,
'category_id', category_id
)
) AS products_json
FROM products;
执行结果:
[
{"id": 1, "name": "笔记本电脑", "price": 5999, "category_id": 1},
{"id": 2, "name": "无线鼠标", "price": 99, "category_id": 2},
...
]
扩展:关联查询嵌套JSON
假设products表关联categories表(商品分类),查询商品及其分类信息:
SELECT json_agg(
json_build_object(
'id', p.id,
'name', p.name,
'price', p.price,
'category', json_build_object(
'id', c.id,
'name', c.name
)
)
) AS products_with_category
FROM products p
JOIN categories c ON p.category_id = c.id;
结果:
[
{
"id": 1,
"name": "笔记本电脑",
"price": 5999,
"category": {"id": 1, "name": "电子产品"}
},
{
"id": 2,
"name": "无线鼠标",
"price": 99,
"category": {"id": 2, "name": "电脑配件"}
},
...
]
通用方法:设置查询结果为JSON格式
多数关系型数据库(如MySQL、PostgreSQL、SQL Server)支持通过SQL命令直接返回JSON格式结果,无需手动拼接函数。
-
MySQL:使用
SELECT ... INTO OUTFILE或mysql -e命令配合--json参数(MySQL 8.0+)。mysql -u root -p -e "SELECT * FROM users LIMIT 2;" --json > users.json
生成的
users.json内容:[ {"id": 1, "name": "张三", "email": "zhangsan@example.com"}, {"id": 2, "name": "李四", "email": "lisi@example.com"} ] -
PostgreSQL:使用
\g命令配合AS JSON(需psql客户端)。SELECT * FROM users LIMIT 2 \g json
非关系型数据库:MongoDB的JSON读取方法
MongoDB原生存储BSON(Binary JSON,JSON的二进制形式),其查询结果默认就是JSON格式,读取过程更直接。
基本查询:直接返回JSON文档
MongoDB通过find()方法查询数据,返回的是JSON数组(每个文档是一个JSON对象)。
示例场景:查询users集合中的所有用户。
// 使用MongoDB Shell查询 db.users.find().pretty();
执行结果:
[
{
"_id": ObjectId("63f8a1b2c1d2e3f4g5h6i7j8"),
"name": "张三",
"email": "zhangsan@example.com",
"age": 25,
"created_at": ISODate("2023-01-01T10:00:00Z")
},
{
"_id": ObjectId("63f8a1b3c1d2e3f4g5h6i7j9"),
"name": "李四",
"email": "lisi@example.com",
"age": 30,
"created_at": ISODate("2023-01-02T11:00:00Z")
}
]
注意:_id字段是MongoDB默认生成的BSON对象,可通过{ "_id": 0 }隐藏,或通过toString()转为字符串。
关联查询:使用$lookup实现多表关联(类似SQL的JOIN)
MongoDB 3.



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