1. 什么是嵌套 JSON 转 SQL?
在将 NoSQL 文档数据库(如 MongoDB)数据迁移至关系型数据库,或解析复杂 REST/GraphQL 接口时,开发者经常需要将 JSON 记录导入到关系型数据库(如 MySQL、PostgreSQL 或 SQLite)中。
然而,JSON 对象中常包含多层嵌套的子对象(例如 {"user": {"profile": {"age": 28}}}),这无法直接映射到二维的关系型数据库表结构中。
2. 核心转换痛点
- 嵌套结构打平 (Flattening):需要将多层嵌套对象递归展开为以下划线连接的列名(如
user_profile_age)。 - SQL 方言标识符转义:
- MySQL:使用反引号转义列名与表名
- PostgreSQL:使用双引号转义列名与表名
- SQLite:使用标准转义格式
- 字面量转义与参数绑定边界:本工具输出经过字面量转义的迁移草稿;生产应用写库仍必须使用数据库驱动或 ORM 的参数绑定。
3. 对象递归打平算法代码
ts
export function flattenJsonObject(obj: Record<string, any>, prefix = ""): Record<string, any> {
const result: Record<string, any> = {};
for (const key of Object.keys(obj)) {
const val = obj[key];
const newKey = prefix ? prefix + "_" + key : key;
if (val !== null && typeof val === "object" && !Array.isArray(val)) {
Object.assign(result, flattenJsonObject(val, newKey));
} else {
result[newKey] = val;
}
}
return result;
}4. 常见问题解答 (FAQ)
Q1: JSON 中的嵌套数组在转换为 SQL 时如何处理?
包含基础值或对象的数组会被自动序列化为标准的 JSON 字符串(如 '["admin", "dev"]'),方便直接插入到 MySQL 5.7+ 或 PostgreSQL 的 JSON 或 TEXT 字段类型中。
Q2: 本站的 JSON 转 SQL 工具支持哪些数据库方言?
支持 MySQL(反引号包裹)、PostgreSQL(双引号包裹)及 SQLite 语法,并能自动处理布尔值在不同方言下的映射(1/0 与 TRUE/FALSE)。
Q3: 数据是否上传,生成结果可以直接执行吗?
转换在浏览器内存中完成,不会主动上传粘贴的 JSON。输出应作为草稿人工复核,并保留原始数据;应用程序写库必须继续使用参数化查询。