令人崩溃的yaml(yml配置)对比properties、json、TOML
2019年04月10日


经过:原本,我一直以为,yml格式非常好用,至少比 properties要科学,比 json 要简洁、强大,然而,下面遇到的这个案例,让我意识到,yaml并不是万能,也并不是最科学、最简洁的


我有这样一个 spring-boot的配置文件(原本是properties格式如下):

keycloak.realm = demo
keycloak.resource = fm-cache-cloud
keycloak.credentials.secret = d4589683-0ce7-4982-bcd3
keycloak.security[0].authRoles[0] = user
keycloak.security[0].collections[0].name = sso login url
keycloak.security[0].collections[0].patterns[0] = /login/*

还是比较直观,而且 借助复制粘贴 写起来倒也简单。

然而,我在另一个新项目中,想把它转换成 yaml格式,很快,我发现不妙,不信你可以试试。

我转换的结果是这样的:

keycloak:
	realm: demo
	resource: fm-cache-cloud
	credentials: 
	    secret: d4589683-0ce7-4982-bcd3
	security:
		- 
			authRoles:
				- user
			collections: 
				- 
					name: sso login url
					patterns: 
						- /manage/ssologin/*

转换费了我不少功夫,而且一看,这是什么玩意儿啊,乱七八糟的,不直观,反人类啊。


于是 我找到了一个 “像样的人类可读的格式”(easy for humans to read and write)

——那就是 TOML


GitHub 目前的新项目已经转用 CoffeeScript 了。CoffeeScript 比JavaScript 要简洁优雅得多。

同样地,GitHub 也觉得 YAML 不够简洁优雅,因此捣鼓出了一个TOML


TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner 。


TOML 的目标

TOML 的目标是成为一个极简的配置文件格式。TOML 被设计成可以无歧义地被映射为哈希表,从而被多种语言解析。


例子

title = "TOML 例子"

[owner]
name = "Tom Preston-Werner"
organization = "GitHub"
bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
dob = 1979-05-27T07:32:00Z # 日期时间是一等公民。为什么不呢?

[database]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ]
connection_max = 5000
enabled = true

[servers]

  # 你可以依照你的意愿缩进。使用空格或Tab。TOML不会在意。
  [servers.alpha]
  ip = "10.0.0.1"
  dc = "eqdc10"

  [servers.beta]
  ip = "10.0.0.2"
  dc = "eqdc10"

[clients]
data = [ ["gamma", "delta"], [1, 2] ]

# 在数组里换行没有关系。
hosts = [
  "alpha",
  "omega"
]

详见官方文档:https://github.com/toml-lang/toml/blob/master/versions/cn/toml-v0.5.0.md


TOML的实现和各种语言支持

如果你有一个实现,请发一个合并请求,把你的实现加入到这个列表中。请在你的解析器的 README 中标记你的解析器支持的 提交SHA1 或 版本号。

校验

@BurntSushi) - https://github.com/BurntSushi/toml/tree/master/tomlv

TOML 测试套件 (语言无关)

编辑器支持

编码器