正在加载,请稍候…

将 JSON 转换为 TOML:配置文件实用指南

正确地将 JSON 转换为 TOML——对象、数组和嵌套数据如何映射到 TOML 表,null 和混合类型数组的常见陷阱,以及何时 TOML 是更好的配置格式。

将 JSON 转换为 TOML:配置文件实用指南

为什么将 JSON 转换为 TOML?

JSON 作为一种数据交换格式无处不在,但它从未被设计为手工编辑。它没有注释,对尾随逗号要求严格,并且使用难以扫描的大括号进行深层嵌套。TOML(Tom's Obvious Minimal Language)正是针对人工编辑的配置用例:它读起来像 INI 文件,支持注释,并能清晰地映射到哈希表。将 JSON 配置转换为 TOML 是采用 Cargo、Hugo 或任何标准化为 *.toml 的项目时的常见步骤。

将 JSON 转换为 TOML:配置文件实用指南插图

结构如何映射

核心思想:JSON 对象 变成 TOML ,键变成 key = value 对。以下是并排对比:

{
  "title": "My App",
  "owner": {
    "name": "Ada",
    "active": true
  },
  "ports": [8000, 8001]
}

变成:

title = "My App"
ports = [8000, 8001]

[owner]
name = "Ada"
active = true

注意,顶层标量先出现,嵌套的 owner 对象变成 [owner] 表头。TOML 要求标量键出现在同一级别的任何表头之前——转换器会为你处理此顺序,但这解释了为什么输出相对于 JSON 重新排序。

将 JSON 转换为 TOML:配置文件实用指南插图

数组和表数组

JSON 对象数组映射到 TOML 表数组,用双括号表示:

{ "servers": [
  { "host": "alpha", "port": 8000 },
  { "host": "beta",  "port": 8001 }
]}
[[servers]]
host = "alpha"
port = 8000

[[servers]]
host = "beta"
port = 8001

每个 [[servers]] 块是数组的一个元素。这是 TOML 最独特的特性之一,也是人们最常手动写错的部分——让转换器生成它消除了猜测。

将 JSON 转换为 TOML:配置文件实用指南插图

陷阱

两种 JSON 事物没有 TOML 等价物,好的转换必须决定如何处理:

  • null — TOML 没有 null 类型。大多数转换器完全丢弃 null 键;请注意键可能会静默消失。如果键有意义,请用哨兵值替换它或有意省略它。
  • 混合类型数组 — JSON 允许 [1, "two", true]。TOML 数组应该是同质的;混合数组在 TOML 1.0 中技术上允许,但许多解析器拒绝它们。请先规范化数据。

还要注意深度嵌套的对象:TOML 使用点分隔的表头如 [a.b.c] 表示深度,这在某种程度上保持可读性,但超过三或四级会变得笨拙。如果你的 JSON 嵌套很深,TOML 可能根本不是合适的目标。

何时 TOML 是正确的选择

TOML 适用于静态的、人工编辑的配置——工具设置、构建清单、应用配置。它不适合大型数据负载、包含大量 null 的内容或机器对机器通信(JSON 的普遍性占优势)。使用转换器将配置一次性迁移到 TOML,然后手动维护并添加注释。

常见问题

JSON 转 TOML 会保留键的顺序吗? 不完全是。TOML 要求标量键在嵌套表之前,因此顶层值先发出,表随后。数据相同;只有呈现顺序改变。

null 值会怎样? TOML 没有 null。具有 null 值的键通常在转换期间被丢弃。明确决定是省略它们还是用占位符替换。

每个 JSON 文件都能变成有效的 TOML 吗? 不能。混合类型数组和 null 值没有干净的 TOML 表示,极深的嵌套变得笨拙。扁平到中等嵌套的配置可以干净地转换。

将你的 JSON 粘贴到上面的转换器中,即可立即获得格式化的 TOML,包括嵌套对象列表的正确表数组输出。