YAML和JSON的前世今生

JSON源自JavaScript的对象字面量语法,设计目标是数据交换格式。YAML(YAML Ain't Markup Language)设计目标是配置文件格式,强调人类可读性。两者都能表达嵌套数据结构,但设计哲学截然不同:JSON追求简洁和通用性,YAML追求可读性和表达力。

语法对比

JSON使用花括号和方括号标记结构,依赖逗号分隔。YAML使用缩进表示层级关系,不需要括号和逗号。YAML支持注释(#),JSON不支持。YAML支持多行字符串(|和>),JSON需要用\n转义。YAML支持锚点和引用(&和*),实现数据复用。

何时使用JSON?

  • API数据传输——JSON是Web API的事实标准
  • 需要严格语法检查的场景——JSON解析器对错误零容忍
  • 跨语言数据交换——几乎所有编程语言都有JSON库
  • 日志和数据存储——结构化、易解析、工具链成熟
  • package.json、tsconfig.json等开发工具配置

何时使用YAML?

  • Docker Compose、Kubernetes配置——官方指定格式
  • CI/CD流水线配置——GitHub Actions、GitLab CI都使用YAML
  • 需要注释的配置文件——YAML支持注释,方便记录决策
  • 多环境配置——利用锚点和引用减少重复
  • 长文本配置——YAML的多行字符串语法更优雅

YAML的陷阱

YAML的灵活性也带来了更多出错的可能。缩进错误是最常见的问题——混合使用空格和制表符会导致解析失败。隐式类型转换也很危险:YAML会将yes/no/true/false解析为布尔值,将1:30解析为时间,将不带引号的数字解析为数字类型。如果你的配置中有一个值恰好是"true"字符串,不加引号就会变成布尔值。

另一个常见问题是YAML不允许在文件开头使用---标记但缺少内容。以及,在不同YAML解析器之间,某些边缘情况的行为可能不一致。

安全性考量

YAML的!!python/object标签可以执行任意Python代码,这是一个已知的安全风险。在解析不可信来源的YAML时,务必使用safe_load()而不是load()。JSON没有这个问题,因为JSON规范不支持执行代码的标签。

工具推荐

使用我们的在线YAML/JSON互转工具,一键在两种格式之间转换,帮助你快速迁移配置文件,支持错误提示和示例数据。