JSON扁平化

分隔符:
最大深度:(0=unlimited)

在线JSON扁平化与还原工具,一键将嵌套JSON转为点号分隔的单层键值对,支持自定义分隔符、数组索引展开与反向还原,本地处理更安全。

相关推荐

适用场景

  • 环境变量注入:把Kubernetes ConfigMap或.env配置JSON扁平化后,用下划线分隔导出,逐行拷进CI脚本的export语句。
  • SQL列名生成:把ORM返回的嵌套对象扁平化后取全部键作为新表列名,遇到SQL Server列名超过128字符时配合最大深度限制截断。
  • 数据分析师清洗:把BI系统导出的多维JSON报表扁平化后,导入Pandas按点号键名生成DataFrame列做透视分析。
  • Mock数据生成:前端开发把后端swagger响应示例扁平化为单层键值对,作为本地Mock服务器的固定返回值。
  • 前后端联调对账:联调时把后端实际返回JSON扁平化后,与前端TypeScript接口定义的扁平键名比对,定位字段缺失或拼写不一致。
  • 单元测试断言:把后端接口的预期JSON响应扁平化后,用点号键逐字段做断言,避免深层嵌套对象引用失败的坑。
  • 日志字段提取:运维在排查线上问题时把JSON格式应用日志扁平化,再用grep快速匹配嵌套深处的字段值。
  • 聊天记录归档:把IM导出的会话JSON扁平化后存入数据仓库,方便按发言人、时间戳做多维聚合统计。
  • 反扁平化还原配置:运维把运维平台导出的扁平配置(用双下划线分隔)一键还原成原嵌套结构,粘回Ansible或Terraform配置。
  • 数据库导出预处理:从MongoDB或PostgreSQL JSONB字段导出嵌套文档后,扁平化再写入列式存储或导出Parquet文件。
  • i18n翻译文件整理:把多层嵌套的多语言JSON扁平化后逐项翻译,再用反扁平化一键还原成原目录树结构。
  • 接口文档生成:把OpenAPI examples里的嵌套响应扁平化,作为Markdown表格的列头直接生成参数对照表。
  • 失败请求排障:测试在重放线上失败请求时,把请求与响应JSON都扁平化,逐字段对比正常与异常两次结果的差异。
  • 前端表单回填:把后端返回的嵌套用户资料扁平化后,按点号键自动填充到嵌套表单组件的对应字段。

使用方法

  1. 把需要处理的JSON粘贴到左侧输入框,或点击上传按钮选择本地.json文件,也可以先点击示例载入一份嵌套样例
  2. 在工具栏切换"扁平化"或"还原"模式,并在底部选项区设置分隔符、数组处理方式和最大展开深度
  3. 工具会自动实时处理,右侧输出区即时显示结果与键数量、最大深度统计
  4. 点击复制按钮把结果写入剪贴板,或点击下载按钮保存为.json文件到本地

功能特点

  • 双向转换:支持JSON扁平化与反扁平化,随时在嵌套与单层之间无损切换
  • 自定义分隔符:默认点号,可改用下划线、斜杠、双下划线或任意字符,适配不同下游系统
  • 数组处理可配置:可选展开为索引键(如items.0.items.1)或整体保留为单值,覆盖表格化与配置两类场景
  • 最大深度限制:可设置展开深度上限,避免深层嵌套产生过长的键名
  • 实时统计:处理后即时显示键数量与最大深度,方便评估输出规模
  • 本地隐私处理:所有解析与转换在浏览器端完成,JSON数据零上传,适合敏感接口与生产配置
  • 文件上传与示例:支持上传.json文件,也提供一键载入示例数据,快速验证转换效果
  • 复制与下载:处理结果可一键复制到剪贴板或下载为标准.json文件,方便二次处理

代码示例

JavaScript实现JSON扁平化

javascript
function flatten(obj, prefix = '', sep = '.') {
  return Object.entries(obj).reduce((acc, [key, value]) => {
    const newKey = prefix ? `${prefix}${sep}${key}` : key;
    if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
      Object.assign(acc, flatten(value, newKey, sep));
    } else {
      acc[newKey] = value;
    }
    return acc;
  }, {});
}

flatten({ user: { name: 'Alice', contact: { email: 'a@x.com' } } });
// => { 'user.name': 'Alice', 'user.contact.email': 'a@x.com' }

Python实现JSON扁平化

python
def flatten(obj, parent_key='', sep='.'):
    items = {}
    for key, value in obj.items():
        new_key = f"{parent_key}{sep}{key}" if parent_key else key
        if isinstance(value, dict):
            items.update(flatten(value, new_key, sep))
        else:
            items[new_key] = value
    return items

import json
print(json.dumps(flatten({'user': {'name': 'Alice'}}), indent=2))
# => {"user.name": "Alice"}

命令行使用jq扁平化

bash
# 把嵌套JSON转为点号扁平结构
jq '[paths(scalars) as $p | {"key": $p | join("."), "value": getpath($p)}] | from_entries' data.json

# 把扁平JSON还原为嵌套结构
# 需要配合 jq-1.7+ 与第三方过滤器,或使用本工具的"还原"模式

常见问题

什么是JSON扁平化?什么时候需要用?

JSON扁平化是把多层嵌套的对象或数组转换为单层键值对的过程,嵌套键名通过分隔符(默认为点号)拼接,例如{"user":{"name":"Alice"}}会变成{"user.name":"Alice"}。当你需要把嵌套JSON导出为CSV、写入MongoDB点号查询、做Elasticsearch索引、配置成环境变量或对接只接受扁平键的下游系统时,就需要用到JSON扁平化。

扁平化后的JSON还能还原成嵌套结构吗?

可以。本工具内置反扁平化模式,只要分隔符设置一致,就能无损地把扁平键值对还原回原来的嵌套对象与数组,且会自动识别连续整数索引(0、1、2…)还原为数组,无需手动指定。

支持自定义分隔符吗?数组怎么处理?

支持。分隔符可以是点号、下划线、斜杠、双下划线或任意字符,最长3位。数组有两种处理方式:默认按数字索引展开为items.0、items.1;也可勾选保留整个数组作为单值。还可以设置最大展开深度(0表示不限制),超过指定层级的嵌套将作为整体保留,避免键名过长。

在线处理JSON会泄露隐私吗?

不会。所有解析、扁平化与反扁平化操作都在你的浏览器本地完成,JSON数据不会经过任何服务器上传。生产接口、线上配置与个人数据全程不离开你的设备,可放心使用。

JSON扁平化在MongoDB里怎么用?

MongoDB默认使用点号语法访问嵌套字段,例如查询user.contact.email等于alice@example.com的文档,命令为{ "user.contact.email": "alice@example.com" }。用本工具把嵌套JSON转为点号扁平结构后,对应的键名可以直接复制到find查询、update更新和聚合管道里,省去手写路径的成本。

扁平化之后怎么导出CSV或Excel?

扁平化的输出本身就是单层键值对,每条记录的所有字段都在同一层,可以直接复制到我们的JSON转CSV工具,或在Excel/Pandas里按点号键名作为列头导入。对于数组里的对象,建议用最大深度限制或保留数组整体,避免一行记录被拆成多行。

什么场景适合用下划线或斜杠做分隔符?

点号(user.address.city)最通用,适合JS对象与MongoDB查询;下划线(user_address_city)适合SQL列名、Python变量名与环境变量;斜杠(user/address/city)类似文件路径,常用于REST API路径参数;双下划线(user__address__city)适合Django配置等本身就含下划线的场景。

键名本身带点号或下划线会冲突吗?

会。例如原始键名是user.name,再以点号为分隔符扁平化后会变成user.name.name,反扁平化时会按user→name→name拆成两层。因此遇到键名含分隔符字符时,请改用不会出现在键名里的分隔符,例如斜杠或双下划线,或者在操作前对原始键名做转义。

数组里的对象会被展开成什么形式?

默认按数字索引展开,例如orders数组里的两个对象会变成orders.0.id、orders.0.total、orders.1.id、orders.1.total。如果你的下游只想要一维表,这种结构直接对应CSV的多行数据。反扁平化时,连续整数索引(0、1、2…)会被自动还原为数组,无需额外开关。

处理很大的JSON会卡吗?

本工具在浏览器中处理,常见接口响应(几十到几百KB)都能秒级完成;几MB以上的超大文件建议优先在本地命令行用jq处理,避免浏览器内存压力。若仍要在线处理,可先用压缩/精简字段再粘贴,或拆分成多个批次分别扁平化。

最大深度限制有什么用?

最大深度限制可以把展开控制在指定层级,超过层级的嵌套对象会作为整体保留为一个值。它有两个常见用途:一是防止过深的配置层级生成冗长的键名;二是保护下游数据库的列名长度限制(如某些SQL Server列名上限128字符)。默认0代表不限制,按需调整即可。

转换后的结果可以保存或复用吗?

可以。处理完成后可以一键复制结果到剪贴板,也可以直接下载为标准的.json文件。整个过程都在本地完成,不需要注册账号,也不会被服务端缓存。

故障排查

提示"输入不是合法的JSON"

原因:JSON文本存在语法错误,如缺引号、逗号多余、括号未闭合、布尔值写成Python风格True/False。解决:先用本工具集里的JSON格式化/校验工具检查语法;注意布尔与null必须小写且不加引号,键名必须用双引号。

扁平化后键名冲突,反扁平化时层级错乱

原因:原始键名本身就包含所选分隔符(例如user.name在用点号分隔时),导致拆分时多出一层。解决:改用不会出现在键名里的分隔符(斜杠、双下划线或自定义字符),或者在操作前对原始键名做转义/替换。

数组被展开后导出CSV变成多行

原因:默认会把数组元素按数字索引展开,每个数组元素都生成一组键值对,与其它字段交叉后形成多条记录。解决:若要一行一对象,请勾选"保留整个数组作为单值",或在CSV工具里指定数组字段不展开;若需要每个数组元素一行,那是预期行为。

反扁平化结果不是预期的数组

原因:只有键名里出现连续整数索引(0、1、2…)时才会被还原为数组,如果键名是orders.first、orders.second则会被识别为对象。解决:重新扁平化时不要改写数字索引,或者手动把数组字段的键名改成orders.0、orders.1的纯数字形式再还原。

键名过长或数据库列名被截断

原因:深度嵌套JSON扁平化后,路径键可能超过下游SQL Server、PostgreSQL等数据库的列名长度限制。解决:在工具选项里设置"最大展开深度",超过指定层级的嵌套会作为整体保留;或者拆解嵌套结构、对深路径键做重命名后再处理。

浏览器处理大文件卡顿或崩溃

原因:超大JSON(几十MB以上)会占用大量浏览器内存,导致页面无响应或崩溃。解决:把文件拆分后再处理,或者改用命令行工具(如jq、flatten-json、Python脚本),本工具更适合处理接口响应、配置、日志条目等常见规模的数据。