TOML / JSON 互转工具
TOML 与 JSON 双向转换:TOML 解析支持注释、数组表([[...]])、点号键、内联表、
多行字符串、日期时间类型;JSON 转 TOML 自动序列化。配语法校验、精确错误定位、
TOML 类型陷阱提示(日期时间类型丢失、大整数精度丢失、null 不支持)。
所有解析在浏览器本地完成,无需上传。
常见问题
TOML 是什么?和 YAML、JSON 有什么区别?
TOML(Tom's Obvious, Minimal Language)是专为配置文件设计的格式,
由 GitHub 创始人 Tom Preston-Werner 发起,现为 Rust(Cargo.toml)、
Python(pyproject.toml)、Go、Pnpm 等主流生态的配置文件标准。
核心优势是语义明确、类型严格、解析简单。
- TOML vs JSON:TOML 支持注释、多行字符串、日期时间类型,可读性远高于 JSON;JSON 更适合数据交换
- TOML vs YAML:TOML 类型严格(无 yes/no 布尔陷阱)、缩进不敏感(用表头分段而非缩进)、解析器行为统一;YAML 支持多文档、锚点 / 别名,但类型推断有陷阱
- 选型建议:配置文件优先 TOML(明确、安全),数据交换用 JSON(通用、紧凑),需要多文档 / 复杂引用时用 YAML
TOML 的基本语法是怎样的?
TOML 由「键值对」和「表」组成,大小写敏感、UTF-8 编码:
# 注释用 # 开头
title = "工具盒子" # 字符串(双引号)
version = "1.0.0"
count = 42 # 整数
rate = 3.14 # 浮点数
enabled = true # 布尔
created = 2024-01-15 # 日期(TOML 独有类型)
tags = ["前端", "工具"] # 数组
# 表用 [表名] 分段(等价于嵌套对象)
[server]
host = "0.0.0.0"
port = 8080
# 点号键等价于嵌套(无需显式定义表)
database.url = "localhost" # 等价于 [database]\nurl = "localhost"
TOML 用表头 [section] 分段,不依赖缩进(与 YAML 不同),
这是它比 YAML 更易解析的根本原因。
TOML 的日期时间类型转 JSON 后会变成什么?为什么需要提示?
TOML 有 4 种日期时间类型,是它区别于 JSON / YAML 的核心特性。但 JSON 没有日期类型, 转换后会变成 ISO 8601 字符串,类型信息丢失:
- 偏移日期时间
2024-06-01T10:30:00+08:00→"2024-05-31T18:30:00.000Z"(转为 UTC,时区偏移丢失) - 本地日期时间
2024-06-01T10:30:00→"2024-06-01T10:30:00.000Z"(无时区,但 JSON 强加 Z 后缀) - 本地日期
2024-01-15→"2024-01-15T00:00:00.000Z"(被强加 T00:00:00.000Z 时区) - 本地时间
10:30:00→"1970-01-01T10:30:00.000Z"(被强加 1970-01-01 日期与 UTC 时区)
本工具在检测到日期时间值时会给出类型提示,说明该字段转 JSON 后的形态, 帮助用户识别时区与类型变化。如需保留原始 TOML 格式,请在消费 JSON 时按字符串还原。
TOML 的数组表 [[...]] 是什么?和普通表 [...] 有什么区别?
数组表(Array of Tables)用双方括号 [[...]] 定义,
生成的是对象数组,每个 [[...]] 新增一个元素:
[[dependencies]]
name = "react"
version = "18.3.1"
[[dependencies]]
name = "astro"
version = "5.6.1"
# 转 JSON 后:
# "dependencies": [
# { "name": "react", "version": "18.3.1" },
# { "name": "astro", "version": "5.6.1" }
# ]
而普通表 [dependencies] 只定义一个对象。这是 TOML 表达「同类集合」的标准方式,
Cargo(依赖列表)、pyproject(工具配置)都大量使用。
TOML 的点号键和内联表有什么区别?
两者都能表达嵌套结构,但写法不同,语义等价:
# 点号键(适合零散字段)
server.host = "0.0.0.0"
server.port = 8080
# 等价于显式表
[server]
host = "0.0.0.0"
port = 8080
# 内联表(适合紧凑单行,不能跨行)
point = { x = 1, y = 2 }
# 等价于
[point]
x = 1
y = 2 - 点号键:无需提前定义表,零散添加字段方便
- 显式表:表头清晰,适合多字段集中定义
- 内联表:单行紧凑,适合少量字段的嵌套值,不能跨多行
TOML 的字符串有几种?多行字符串怎么写?
TOML 有 4 种字符串写法:
- 基本字符串
"...":双引号,支持转义(\n/\t/\"/\uXXXX) - 字面字符串
'...':单引号,不转义(\n是字面反斜杠 n),适合正则、Windows 路径 - 多行基本字符串
"""...""":三双引号,支持换行、转义,行尾反斜杠可续行 - 多行字面字符串
'''...''':三单引号,支持换行、不转义,适合代码块、文档
# 字面字符串:反斜杠不转义,写正则最方便
pattern = '\d+\.\d+'
# 多行字面字符串:保留原始格式
description = '''
第一行
第二行(首行换行会被裁剪)
''' TOML 的整数转 JSON 会丢失精度吗?
会。TOML 支持 64 位整数(范围 -9223372036854775808 到 9223372036854775807),
但 JavaScript Number 只能安全表示 ±9007199254740991(2^53-1)。
超过此范围的整数转 JS Number 后会丢失精度。
# 安全范围(2^53-1 内)
small_id = 9007199254740991 # 精确
# 超出安全范围(精度丢失)
big_id = 9223372036854775807 # 转后变成 9223372036854776000
本工具在检测到超出 Number.MAX_SAFE_INTEGER 的整数时会给出提示。
如需精确处理,请在消费端用 BigInt 或字符串还原。
JSON 转 TOML 时为什么报错?TOML 不支持什么?
TOML 有几条严格限制,JSON → TOML 时常见报错原因:
- 不支持 null:JSON 的
null在 TOML 中无对应类型。需删除该字段、改为空字符串、或用其他语义表达 - 不支持 undefined:JSON 不会有 undefined,但 JS 对象可能含
- 不支持循环引用:JSON 本身不支持,但需注意
- 顶层必须是表:JSON 顶层若是数组或原始值,TOML 无法直接表达(TOML 文档根必须是表)
本工具在 JSON → TOML 模式下检测到 null 值时会给出提示,标明具体字段路径。
本工具支持 TOML 的所有特性吗?基于什么库?
本工具基于 smol-toml, 完全符合 TOML v1.0.0 规范。支持的特性:
- 支持:注释、表 / 数组表、点号键、内联表、多行字符串(基本 / 字面)、4 种日期时间类型、整数(十进制 / 十六进制 / 八进制 / 二进制 / 下划线分隔)、浮点数(含 inf / nan)、布尔、数组(可嵌套、可混合类型)
- 类型陷阱提示:日期时间值转 JSON 后类型丢失、大整数精度丢失、JSON null 不可转
- 不支持:TOML v1.0.0 之后的草案特性(如多行内联表、跨表引用)
对于绝大多数配置文件(Cargo.toml、pyproject.toml、Go go.mod 配置、Pnpm 配置), 本工具都能正确解析。