深入对比TOML,JSON和YAML

小编 2026-07-10 阅读:1986 评论:0
 坦率地说,在我开始与Hugo TOML合作之前,我感到羞耻是一个需要发现的新领域,但我对YAM...

 

坦率地说,在我开始与Hugo TOML合作之前,我感到羞耻是一个需要发现的新领域,但我对YAML和JSON非常熟悉。本文将帮助您了解如何通过不同的数据格式构建数据。

 

在Hugo中,您可以将所有这三种数据格式用于配置,前置事项和自定义数据,但TOML是用于整个项目的推荐格式。首先我想简单介绍一下每种数据格式,然后再进入规范和比较。

TOML(Tom's Obvious,Minimal Language)

TOML显然是由Tom - Tom Preston-Werner编写的 - 确切地说。这是一个在麻省理工学院授权的开源项目,目前在Github上有超过5k星2013年3月发布的第一个TOML版本,使TOML成为三个标准的年轻人。

TOML的目标是成为最小的配置文件格式,由于精确的语义,这种格式易于阅读。TOML被设计为无歧义地映射到散列表。TOML应该很容易用各种语言来解析数据结构。

关于TOML语法的简短事实

  • TOML区分大小写。
  • TOML文件只能包含UTF-8编码的Unicode字符。
  • 空格表示制表符(0x09)或空格(0x20)。
  • 换行符表示LF(0x0A)或CRLF(0x0D0A)。

要在前面的问题中使用TOML,你需要将它封装在+++如下之间

+++date = "2016-12-14T21:27:05.454Z"publishdate = "2016-12-14T21:27:05.454Z"title = "Deep dive into TOML, JSON and YAML"tags = ["toml","yaml","json", "front matter"]type = "article"[amp]    elements = []    [article]    lead = "Lorem ipsum."    category = "frontmatter"    related = [][sitemap]  changefreq = "monthly"  priority = 0.5  filename = "sitemap.xml"+++

YAML(不是标记语言)

YAML是一种广泛使用的语言,用于跨不同语言和框架的配置文件。YAML的创建者和维护者是Clark C. Evans,起初是SML-DEV,专注于简化XML的XML人员名单帮助生成Common XML,这是一个功能强大的XML子集,为XML创建了数据序列化的替代方案,特别是与Python ,Perl和Ruby。该项目始于2001年,第一个1.0版本于2009年1月由Oren Ben-Kiki,Clark Evans和Brian Ingerson发布。自2009年以来,当前版本1.2正在使用中。

关于YAML语法的简短事实

  • .yml文件以' - '开头,标记文档的开始
  • 键值对由冒号分隔
  • 列表以连字符开头
  • YAML使用具有一个或多个空格的缩进来描述嵌套集合

要在前面的问题中使用YAML,你需要将它包裹在之间---

---date: '2016-12-14T21:27:05.454Z'publishdate: '2016-12-14T21:27:05.454Z'title: Deep dive into TOML, JSON and YAMLtags:- toml- yaml- json- front mattertype: articleamp:  elements: []article:  lead: Lorem ipsum.  category: frontmatter  related: []sitemap:  changefreq: monthly  priority: 0.5  filename: sitemap.xml---

JSON(JavaScript对象表示法)

JSON是一种轻量级的数据交换格式。由于JavaScript和大多数Serverside语言本身支持JSON,因此JSON广泛用于Web环境中浏览器和服务器之间的API通信。在21世纪初,Douglas Crockford引入了数据格式JSON的第一个规范。当前版本由ECMA-404于2013年10月指定。

有关JSON语法的简短事实

  • 数据存储在名称/值对中
  • 记录用逗号分隔。没有以下属性的尾随逗号是不允许的。
  • 双引号包装属性名称和字符串。单引号是不允许的。

由于JSON包裹在两个花括号中,{}因此在Hugo的前端内容中没有必要使用特殊的包装:

{    "date" : "2016-12-14T21:27:05.454Z",    "publishdate" : "2016-12-14T21:27:05.454Z",    "title" : "Deep dive into TOML, JSON and YAML",    "tags" : ["toml","yaml","json", "front matter"],    "type" : "article",    "amp" : {        "elements" : []    },    "article" : {        "lead" : "Lorem ipsum.",        "category" : "frontmatter",        "related" : []    },    "sitemap" : {      "changefreq" : "monthly",      "priority" : 0.5,      "filename" : "sitemap.xml"    }}

TOML,YAML和JSON之间的语法差异

现在让我们来看看最常见用例中的语法和功能集差异。

字符串

任何格式都支持Strings。唯一的区别在于,JSON不支持多行字符串。

TOML

key = "String Value"multiline = """       The quick brown        fox jumps over        the lazy dog.       """

YAML

key : String ValuemultilinePreservedLinebreaks:|  L1 - The quick brown  L2 - fox jumps over  L3 - the lazy dog.multilineReplaceLinebreaksWithWhitespace:>  This sentence ist just too long to keep it  on the same line.

JSON

{  "key" : "String Value"}

对象/哈希表/集合

TOML中的表格几乎与YAML中的JSON和Collections中的对象相同。要访问Hugo模板中的集合,请按照.类似方式导航{{ .Params.objectkey.subkey }}

TOML

[table_key]property = "Value"secondProperty = "2nd Value"[alternative.direct]access = "results in alternative.direct.access for this value"alternativeCalledInlineTable = { property = "Value", "etc" = "You got it." }

YAML

objectKey:  property: Value  secondProperty: 2nd Valuealternative: { subkey: 5.0, another: 123 }

JSON

{  "objectKey" : {    "property" : "Value",    "secondProperty" : "2nd Value"  }}

数组/列表

数组或列表受所有语言支持。

TOML

fruits = [ "Apple", "Banana", "Strawberry" ]formats = [  "YAML",  "JSON",  "TOML"]

YAML

fruits:  - Apple  - Banana  - Strawberryformats: [ YAML, JSON, TOML ]

JSON

{  "fruits": ["Apple","Banana","Strawberry"],  "formats": [    "YAML",    "JSON",    "TOML"  ]}

为了扩展这些例子,我们可以创建一个对象/表/集合的列表,就像这样:

TOML

[[fruits]]name = "Apple"weight = 600[[fruits]]name = "Banana"weight = 300[[fruits]]name = "Strawberry"weight = 40

YAML

fruits:- name: Apple  weight: 600- name: Banana  weight: 300- name: Strawberry  weight: 40

JSON

{  "fruits": [    {        "name" : "Apple",        "weight" : 600    },    {        "name" : "Banana",        "weight" : 300    },    {        "name" : "Strawberry",        "weight" : 40    }  ]}

上面的所有示例都会生成一个可以{{ range .Params.fruits }}<strong>{{ .name }}</strong> - Weight: {{ .weight }}{{ end }}在Hugo模板文件中迭代的列表

我认为你现在对数组和表格是如何协同工作有了很好的理解; 让我们再次扩展以获得完整的概述。

TOML

[[fruits]]  name = "Apple"  weight = 600  [fruit.physical]    color = "red"    shape = "round"  [[fruit.variety]]    name = "red delicious"  [[fruit.variety]]    name = "granny smith"[[fruits]]  name = "Banana"  weight = 300  [fruit.physical]    color = "yellow"    shape = "curved"      [[fruit.variety]]    name = "plantain"    [[fruits]]  name = "Strawberry"  weight = 40  [fruit.physical]    color = "red"    shape = "kind-of-oval"      [[fruit.variety]]    name = "the-good-one"

YAML

fruits:- name: Apple  weight: 600  physical:    color: red    shape: round  variety:  - name: red delicious  - name: granny smith- name: Banana  weight: 300  physical:    color: yellow    shape: curved  variety:  - name: plantain- name: Strawberry  weight: 40  physical:    color: red    shape: kind-of-oval  variety:  - name: the-good-one

JSON

{  "fruits": [    {        "name" : "Apple",        "weight" : 600,        "physical": {          "color": "red",          "shape": "round"        },        "variety": [          { "name": "red delicious" },          { "name": "granny smith" }        ]    },    {        "name" : "Banana",        "weight" : 300,        "physical": {          "color": "yellow",          "shape": "curved"        },        "variety": [          { "name": "plantain" }        ]    },    {        "name" : "Strawberry",        "weight" : 40,        "physical": {          "color": "red",          "shape": "kind-of-oval"        },        "variety": [          { "name": "the-good-one" }        ]    }  ]}

数字(整数,浮点数,无穷大等)

所有数据结构中的数字编写都非常相似,但功能集有所不同:

TOML

explicit_pos = +99positive = 42zero = 0negative = -17# For large numbers, you may use underscores to enhance readability.# Each underscore must be surrounded by at least one digit.large = 1_000verylarge = 5_349_221# fractionalfloat = +1.0float_pi = 3.1415negative_float = -0.01# exponentflt4 = 5e+22flt5 = 1e6flt6 = -2E-2# bothflt7 = 6.626e-34

YAML

integer: 12octal_number: 014hexadecimal: 0xCfloat: 18.6exponential: 1.2e+32infinity: .inf

JSON Infinity并且NaN在JSON中不受支持)

{  "integer": 12,  "octal_number": 12,  "hexadecimal": 12,  "float": 18.6,  "exponential": 1.2e+32}

杂项 - 日期时间,布尔,空

TOML

bool1 = truebool2 = falsedate1 = 1979-05-27T07:32:00Zdate2 = 1979-05-27T00:32:00-07:00date3 = 1979-05-27T00:32:00.999999-07:00

YAML

bool1: truebool2: falsenull1: nullnull2: ~date_iso: 2016-12-14T21:59:43.10-05:00 # ISO-8601date_simple: 2016-12-14

JSON

{  "bool1": true,  "bool2": false,  "null1": null,  "date_iso": "2016-12-14 21:59:43 -0500",  "date_simple": "2016-12-14"}

  总结:希望大家能很好地了解这三种数据结构之间的差异,以便使用它们中的任何一种。要简洁同时功能强大,请用yaml, 要在不同语言中交换、共享数据,请用json, 想尝鲜,用toml,还不够的话,请用xml吧。

谋胆并重
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表