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互转工具,一键在两种格式之间转换,帮助你快速迁移配置文件,支持错误提示和示例数据。