TOML的由来

配置文件的使用由来已久,从.ini、XML、JSON、YAML再到TOML,语言的表达能力越来越强,同时书写便捷性也在不断提升。 TOML是前GitHub CEO, Tom Preston-Werner,于2013年创建的语言,其目标是成为一个小规模的易于使用的语义化配置文件格式。TOML被设计为可以无二义性的转换为一个哈希表(Hash table)。

例子

  1. # 这是一个TOML文件
  1. title = "TOML Example"
  2.  
  3. [owner]
  4. name = "Lance Uppercut"
  5. dob = 1979-05-27T07:32:00-08:00 # 日期是一等公民
  6.  
  7. [database]
  8. server = "192.168.1.1"
  9. ports = [ 8001, 8001, 8002 ]
  10. connection_max = 5000
  11. enabled = true
  12.  
  13. [servers]
  14. #你可以使用空格、制表符进行缩进,或者根本不缩进。TOML不关心缩进。
  15. [servers.alpha]
  16. ip = "10.0.0.1"
  17. dc = "eqdc10"
  18.  
  19. [servers.beta]
  20. ip = "10.0.0.2"
  21. dc = "eqdc10"
  22.  
  23. [clients]
  24. data = [ ["gamma", "delta"], [1, 2] ]
  25.  
  26. # 数组内可以混入换行符
  27. hosts = [
  28. "alpha",
  29. "omega"
  30. ]

规范

  • TOML是大小写敏感的
  • TOML文件必须是UTF8编码的
  • 空白符可以是制表符(0x09)或空格(0x20)
  • 换行符可以是 LF (0x0A) 或 CRLF (0x0D0A)

TOML仍在不断完善,目前的版本0.4.0,下面是最新的规范。

注释

使用#来表示注释开始,至当前行尾结束。

  1. # I am a comment. Hear me roar. Roar.
  2. key = "value" # Yeah, you can do this.

字符串

TOML中有4种字符串表示方法:基本、多行-基本、字面量、多行-字面量。所有字符串必须是合法的UTF8字符。

基本字符串由双引号包裹,所有Unicode字符均可出现,除了双引号、反斜线、控制字符(U+0000 to U+001F)需要转义。

str = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."

常用的转义序列:

  1. \b - backspace (U+0008)
  2. \t - tab (U+0009)
  3. \n - linefeed (U+000A)
  4. \f - form feed (U+000C)
  5. \r - carriage return (U+000D)
  6. \" - quote (U+0022)
  7. \\ - backslash (U+005C)
  8. \uXXXX - unicode (U+XXXX)
  9. \UXXXXXXXX - unicode (U+XXXXXXXX)
  1. 多行-基本字符串由三个双引号包裹,除了分隔符开始的换行外,字符串内的换行将被保留。
  1. str1 = """
  2. Roses are red
  3. Violets are blue"""
  1. TOML解析器可以将其翻译为平台相关的字符串,如
  1. # Unix上,上述字符串等同于
  2. str2 = "Roses are red\nViolets are blue"
  3.  
  4. # Windows上,上述字符串等同于
  5. str3 = "Roses are red\r\nViolets are blue"

多行-基本字符串中可以在行尾使用\来忽略其后的所有(换行符和空白符)直到第一个非空白符。

  1. # 以下字符串等价
  2. str1 = "The quick brown fox jumps over the lazy dog."
  3.  
  4. str2 = """
  5. The quick brown \
  6.  
  7. fox jumps over \
  8. the lazy dog."""
  9.  
  10. key3 = """\
  11. The quick brown \
  12. fox jumps over \
  13. the lazy dog.\
  14. """

字面量字符串由单引号包裹,其内不允许转义,因此可以方便的表示基本字符串中需要转义的内容。

  1. # What you see is what you get.
  2. winpath = 'C:\Users\nodejs\templates'
  3. winpath2 = '\\ServerX\admin$\system32\'
  4. quoted = 'Tom "Dubs" Preston-Werner'
  5. regex = '<\i\c*\s*>'

多行-字面量字符串与多行-基本字符串类似。

整数

  1. int1 = +99
  2. int2 = 42
  3. int3 = 0
  4. int4 = -17

为了增加可读性,整数可以使用_分隔。每个_必须被至少一个数字环绕。

不被允许的表达:前置0,2、8、16进制、无穷、NaN。 整数的范围是64bit signed long类型的范围。

浮点数

  1. # fractional
  2. flt1 = +1.0
  3. flt2 = 3.1415
  4. flt3 = -0.01
  5.  
  6. # exponent
  7. flt4 = 5e+22
  8. flt5 = 1e6
  9. flt6 = -2E-2
  10.  
  11. # both
  12. flt7 = 6.626e-34

浮点数的范围是64 bit double类型的范围。

布尔值

小写的true或false。

  1. bool1 = true
  2. bool2 = false

日期时间

使用RFC 3339描述的时间格式

  1. date1 = 1979-05-27T07:32:00Z
  2. date2 = 1979-05-27T00:32:00-07:00
  3. date3 = 1979-05-27T00:32:00.999999-07:00

数组

数组使用方括号包裹。空格会被忽略,包括换行符。元素使用逗号分隔。注意,不允许混用数据类型(所有的字符串类型均为同一类型)。

  1. arr1 = [ 1, 2, 3 ]
  2. arr2 = [ "red", "yellow", "green" ]
  3. arr3 = [ [ 1, 2 ], [3, 4, 5] ]
  4. arr4 = [ "all", 'strings', """are the same""", '''type'''] # this is ok
  5. arr5 = [ [ 1, 2 ], ["a", "b", "c"] ] # this is ok
  6. arr6 = [ 1, 2.0 ] # note: this is NOT ok

表格

表格叶称为哈希表或字典,用来存储键值对。表格名由方括号包裹,且自成一行。

  1. [table]

表格名下,直到下一个表格名或文件尾,均为当前表格的内容。

  1. [table]
  2. key = "value"
  3. bare_key = "value"
  4. bare-key = "value"
  5.  
  6. "127.0.0.1" = "value"
  7. "character encoding" = "value"
  8. "ʎǝʞ" = "value"

表格可以嵌套,即表格中某个键的值可以为表格。

  1. [dog]
  2. onekey = onevalue
  3.  
  4. [dog.tater]
  5. type = "pug"

等价于

  1. {
  2. "dog": {
  3. "onekey":"onevalue",
  4. "tater": { "type": "pug" }
  5. }
  6. }

如果你不想的话,你不用声明所有的父表。TOML 知道该如何处理。

  1. # [x] 你
  2. # [x.y] 不需要
  3. # [x.y.z] 这些
  4. [x.y.z.w] # 可以直接写

表格数组

  1. [[products]]
  2. name = "Hammer"
  3. sku = 738594937
  4.  
  5. [[products]]
  6.  
  7. [[products]]
  8. name = "Nail"
  9. sku = 284758393
  10. color = "gray"

等价于以下的 JSON 结构:

  1. {
  2. "products": [
  3. { "name": "Hammer", "sku": 738594937 },
  4. { },
  5. { "name": "Nail", "sku": 284758393, "color": "gray" }
  6. ]
  7. }

官方github中文版详情

目前支持几乎我熟知所有语言,对应的列表也请查看上面 github 地址,会有具体项目支持。

TOML 详解的更多相关文章

  1. 以太坊客户端Geth命令用法-参数详解

    Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具. 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册. 本文主要是对geth help的翻译 ...

  2. ansible中常用模块详解

    ansible中常用的模块详解: file模块 ansible内置的可以查看模块用法的命令如下: [root@docker5 ~]# ansible-doc -s file - name: Sets ...

  3. 【转】gitlab CI流水线配置文件.gitlab-ci.yml详解

    目录 GitLab CI流水线配置文件.gitlab-ci.yml详解 实验环境 GitLab CI介绍 .gitlab-ci.yml 配置参数 参数详解 script image services ...

  4. Python - poetry(3)配置项详解

    config 命令 poetry 通过 config 命令进行配置 也可以直接在 config.toml 文件中进行配置,该文件将在首次运行该命令时自动创建 文件目录 macOS:~/Library/ ...

  5. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  6. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  7. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  8. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  9. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

随机推荐

  1. C++ 函数 引用

    一.引用的概念 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样.引用的声明方法: 类型标识符 &引用名 = 目标变量名: 为一个变量起一个别名.假如有一个变量a,想给 ...

  2. Daily Srum 10.28

    这两天我们和其他两组进行了一次会议,主要讨论的是用什么框架来搭建这个平台.在线系统的那一组希望我们用nutch.solr.hbase这一套工具,这对于我们两组来说是一次挑战,毕竟我们一开始用的是关系型 ...

  3. jQuery全屏滚动插件fullPage使用

    1. 引入jquery.js和jquery.fullPage.min.js <script src="jquery.min.js"></script> &l ...

  4. Leetcode题库——14.最长公共前缀

    @author: ZZQ @software: PyCharm @file: longestCommonPrefix.py @time: 2018/9/16 17:50 要求:查找字符串数组中的最长公 ...

  5. android--实现通过点击链接打开apk(应用图标在桌面消失)

    首先在AndroidManifest.xml的MAIN Activity下追加以下内容.(启动Activity时给予) ※必须添加项 <intent-filter> <action ...

  6. HttpContext.Current.Server.MapPath("/") 未将对象设置到对象的实例异常。

    多线程中的System.Web.HttpContext.Current.Server.MapPath("/") 多线程中Server.MapPath会失效... 网上找到几种解决方 ...

  7. VNC Server (Ubuntu 16.04.3 GNOME)

    1. 安装VNC服务 sudo apt-get install vnc4server -y 2. 启动VNC服务 vncserver :1 3. 此时客户端连上后你会发现灰屏,原因出在~/.vnc/x ...

  8. C++中sizeof操作符与strlen函数

    sizeof操作符: sizeof是一个操作符,返回一条表达式或一个类型名字所占的字节数.返回值一个常量表达式,类型为size_t. size_t sizeof(type) size_t sizeof ...

  9. 题解 P3870 【[TJOI2009]开关】

    这个题我愣是交了好几遍没有过...... 后来@_皎月半洒花dalao告诉我说要^儿子节点的tag,然后就明白了...... 行吧,先上题面: 题目描述 现有N(2 ≤ N ≤ 100000)盏灯排成 ...

  10. Mac突然连不上WiFi

    标签(空格分隔): 杂七杂八的问题 从昨晚开始,Mac突然连不上WiFi了,人又在图书馆,上不了网好焦急.于是搜了很多方法,也不知是哪个起作用了,反正现在可以了. 步骤一 打开"Finder ...