OKfmt

JSON/YAML/TOML配置对比:开发者选型指南

本文对比三种主流配置格式的设计、语法与生态,帮助开发者为新项目选择适配的配置文件格式。

更新于 2026-08-19

三种格式的核心设计哲学

JSON 源自 JavaScript,设计目标是轻量化跨平台数据交换,语法规则基于 ECMAScript 标准,优先保障机器解析的可靠性。RFC 8259 明确定义其核心用途为结构化数据的跨系统传输。

YAML 全称 YAML Ain't Markup Language,设计定位是人类可读的配置数据,优先降低人工编辑门槛,通过缩进结构简化层级书写,适配非技术人员编辑配置的场景。

TOML 全称 Tom's Obvious, Minimal Language,设计目标是明确语义的配置格式,主张配置语义可被清晰解析,通过显式分段和键值对结构,避免歧义性解读。

核心语法特性对比

三种格式在常用特性上的差异,直接影响配置的编写体验。JSON 未预留注释位置,多数解析器不支持注释语法;YAML 和 TOML 均原生支持单行与多行注释,方便编写配置说明。

多行字符串和日期类型的差异,对应不同场景的需求:YAML 适合编写多行说明或模板内容,JSON 需通过转义处理换行,兼容性一致但编写繁琐。

语法特性JSONYAMLTOML
原生注释支持
原生多行字符串有,两种风格有,三种风格
原生日期时间类型无,仅字符串有,ISO 8601 格式无,仅字符串
语法依赖大括号括号分隔缩进敏感分段符号分隔

常见解析歧义的经典问题

JSON 最广为人知的问题是缺少官方注释支持,部分开发者使用注释后,更换标准解析器会直接触发解析失败,导致配置无法加载。部分衍生方案如 JSONC 补充了注释支持,但未纳入官方标准。

YAML 存在知名的 Norway 问题:当字符串为 20:03 格式时,部分解析器会将其自动转换为 Base60 时间类型,得到数值 1203,与预期的字符串值不符,该问题源于 YAML 隐式类型转换规则。

TOML 不存在隐式类型转换,所有值类型由语法明确标记,不会自动推导类型,因此不存在类似的歧义问题,类型结果符合编写者预期。

主流开发生态的采用情况

三种格式在不同技术栈中的采用程度存在明显分层。下表按应用场景汇总各格式的主流地位,以及对应生态中解析器的成熟程度。

  • Docker Compose 使用 YAML 作为配置格式,支持多服务声明与层级配置
  • npm 生态的 package.json 采用 JSON 存储项目元信息与依赖配置,是 Node.js 项目标准
  • Python PEP 621 规定 pyproject.toml 为 Python 项目配置标准,替代旧有的 setup.py配置
  • GitHub Actions 工作流配置采用 YAML 格式,云原生领域多数工具使用 YAML

格式互转的信息保留边界

不同格式互转时,存在固定的信息丢失边界,OKfmt 格式转换工具会基于语法支持情况保留合法信息,丢弃不兼容内容。JSON 转 YAML 或 TOML 时,不存在原生信息丢失,所有结构均可完整映射。

YAML 转 JSON 时,YAML 的注释和原生日期类型信息会丢失,JSON 不支持这两种特性;TOML 转 JSON 时,仅注释会丢失,所有结构类型均可完整映射。YAML 转 TOML 时,原生日期类型会转换为对应格式的字符串,注释可以完整保留。

常见问题

新项目写配置该选哪种格式?

可根据生态要求选择:Node.js项目默认用JSON,云原生配置默认用YAML,Python项目默认用TOML,自定义项目可按团队习惯选择。

JSON没有注释怎么解决?

可使用JSONC格式编写,构建后转标准JSON,或把说明信息放入专门的description字段,具体方案由项目使用的解析器决定。

YAML缩进问题怎么避免解析错误?

可使用统一的2空格缩进,关闭编辑器制表符替换,部分编辑器插件可实时检查缩进,转换为JSON后可验证结构合法性。