JSON vs YAML vs TOML:2026年该使用哪种配置格式?

发布: (2025年12月27日 GMT+8 03:35)
7 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的完整文本内容,我将按照要求保留源链接并进行简体中文翻译。

三种格式的相同配置

JSON

{
  "database": {
    "host": "localhost",
    "port": 5432,
    "credentials": {
      "username": "admin",
      "password": "secret123"
    },
    "pools": [
      {
        "name": "primary",
        "size": 10
      },
      {
        "name": "replica",
        "size": 5
      }
    ]
  }
}

YAML

database:
  host: localhost
  port: 5432
  credentials:
    username: admin
    password: secret123
  pools:
    - name: primary
      size: 10
    - name: replica
      size: 5

TOML

[database]
host = "localhost"
port = 5432

[database.credentials]
username = "admin"
password = "secret123"

[[database.pools]]
name = "primary"
size = 10

[[database.pools]]
name = "replica"
size = 5

获胜者: 简单配置使用 YAML,复杂嵌套结构使用 TOML。

当事情变得有趣时

JSON – 严格但安全

{
  "name": "John",
  "age": 25,  // ← ERROR: No comments allowed
}  // ← ERROR: Trailing comma

JSON 对错误毫不宽容。缺少一个逗号、一个多余字符,或是尾随逗号,整个文件都会崩溃。这种严格性防止了歧义。

YAML – 灵活但危险

name: John
age: 25
married: no   # Parsed as boolean false
country: NO   # Parsed as boolean false (Norway gets converted!)
version: 1.10 # Becomes float 1.1 (loses the trailing zero!)

YAML 的隐式类型会导致潜在的 bug。那不是配置错误——而是一个随时可能在生产环境中爆炸的逻辑炸弹。

TOML – 清晰且可预期

name = "John"
age = 25
married = false  # Explicit boolean
country = "NO"   # Explicit string
version = "1.10" # Explicit string

TOML 需要显式类型。没有意外,没有隐式转换。

注释支持

JSON – 没有官方注释

{
  "// This is a hack": "JSON doesn't support comments",
  "port": 8080,
  "_comment": "This is another workaround"
}

开发者采用变通方法,导致数据结构被污染。

YAML – 完整的注释支持

# This is a proper comment
port: 8080  # Inline comments work too

# You can document complex sections
database:
  host: localhost  # Override in production

TOML – 完整的注释支持

# Server configuration
# Updated: 2025-01-15
port = 8080  # Default port

[database]
# Connection settings
host = "localhost"

获胜者: YAML 与 TOML 并列(两者都正确支持注释)。JSON 在这里表现很差。

语言‑特定支持

JSON – 通用

// JavaScript (native)
const config = JSON.parse(data);
# Python (standard library)
import json
config = json.loads(data)
// Go (standard library)
var cfg Config
json.Unmarshal(data, &cfg)

YAML – 广泛支持,有时会出现问题

# Python (requires PyYAML)
import yaml
config = yaml.safe_load(data)  # Note: safe_load, not load!
// JavaScript (requires js-yaml)
const yaml = require('js-yaml');
const config = yaml.load(data);

TOML – 支持日益增长

# Python (requires tomli for reading)
import tomli
config = tomli.loads(data)
// Rust (excellent support via serde)
let config: Config = toml::from_str(data)?;

Winner: JSON 远远领先。YAML 排第二。TOML 正在赶上,但尚未达到。

实际场景

API 与数据交换

获胜者: JSON

{
  "status": "success",
  "data": {
    "users": [...]
  }
}

配置文件

复杂度推荐格式
简单配置(< 50 行)YAML
复杂配置(≥ 50 行)TOML

YAML 示例(简单):

app:
  name: MyApp
  port: 3000
  debug: true

TOML 示例(复杂):

[app]
name = "MyApp"
port = 3000
debug = true

[database.primary]
host = "localhost"
port = 5432

[database.replica]
host = "replica.example.com"
port = 5432

CI/CD 流水线

获胜者: YAML

name: Deploy
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: npm install

包管理

生态系统首选格式
JavaScriptJSON (package.json)
RustTOML (Cargo.toml)
PythonTOML (pyproject.toml)

JSON(package.json):

{
  "name": "my-app",
  "dependencies": {
    "express": "^4.18.0"
  }
}

TOML(pyproject.toml):

[project]
name = "my-app"
version = "0.1.0"

[dependencies]
requests = "2.28.1"

安全

  • JSON: 通常安全。

  • YAML: 如果反序列化任意对象可能不安全。危险负载示例:

    !!python/object/apply:os.system
    args: ['rm -rf /']

    始终在 Python 中使用 yaml.safe_load()

  • TOML: 设计上安全。

获胜者: JSON 和 TOML 安全;YAML 需要谨慎。

决策框架

选择何时示例用例
JSON✅ 构建 APIREST API 响应
YAML✅ 编写 CI/CD 配置GitHub Actions、GitLab CI、Docker Compose
TOML✅ 编写应用程序配置文件Cargo.tomlpyproject.toml

示例项目

项目配置文件API 响应Docker 设置
Web 应用TOMLJSONYAML
CLI 工具TOML 或 JSONJSON
DevOps 流水线YAML
库 / 包JSON (JS) / TOML (Python, Rust)

在不同格式之间转换

JSON → YAML

{"name": "John", "age": 25}

转换为

name: John
age: 25

JSON → TOML

{"database": {"host": "localhost", "port": 5432}}

转换为

[database]
host = "localhost"
port = 5432

如需快速转换,可尝试使用在线工具,例如 jsontoall.tools,它支持 JSON ↔ YAML、JSON ↔ TOML 等。

常见误区破解

误区事实
“YAML 总是比 JSON 更易读。”差异往往很小。例如:
{"debug": true, "port": 3000} vs
debug: true<br>port: 3000
“TOML 不能处理复杂的嵌套。”TOML 支持深层表格:
toml<br>[servers.alpha]<br>ip = "10.0.0.1"<br><br>[servers.alpha.database]<br>host = "localhost"<br>
“JSON 不支持注释是因为设计不佳。”JSON 不提供注释是有意为之,以保持数据纯净;类似注释的元数据应放在负载之外。

未来:接下来是什么?

  • JSON5 – JSON 的超集,添加了注释、尾随逗号以及更宽松的语法。
  • YAML 1.3 – 正在进行的工作,以提升安全性和一致性。
  • TOML 1.1 – 为更丰富的数据类型和更好的工具链提供增强。

配置愉快!

带注释、尾随逗号以及其他实用特性的 SON

{
  name: "John",  // Comments work!
  age: 25,       // Trailing comma is fine
}

JSON Schema 正在变得对验证越来越重要

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "age": { "type": "integer", "minimum": 0 }
  }
}

YAML 1.2 修复了 1.1 中的一些问题,但采纳速度缓慢

最后思考

  • JSON 是数据交换的安全、通用选择。
  • YAML 在 DevOps 和 CI/CD 中占优势,因为它已成为标准。
  • TOML 最适合用于应用程序配置文件。

我的个人技术栈(2026)

  • APIs: JSON

讨论

您更喜欢哪种格式,为什么? 请在下方留言——我很想了解您对这些格式的使用经验!

工具

jsontoall.tools – 即时 JSON → YAML、JSON → TOML 以及其他转换。全部免费,基于浏览器,无需注册。

标签: #json #yaml #toml #webdev #configuration #devops #programming

Back to Blog

相关文章

阅读更多 »

YAML 格式化工具

YAML Formatter 是一种用于清理、组织和验证 YAML(YAML Ain’t Markup Language)文件的工具。由于 YAML 对缩进敏感,即使是很小的格式…

在网络上传输 JSON 是专业失职

我已经能预见这篇文章会惹恼一些人。对我来说无所谓。JSON 在传输过程中可读的人的数据问题是我们几十年前犯下的错误 we k...