坦率地说,在我开始与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 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
---

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 Value
multilinePreservedLinebreaks:
|
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 Value
alternative: { 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
- Strawberry
formats: [ 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 = +99
positive = 42
zero = 0
negative = -17 # For large numbers, you may use underscores to enhance readability.
# Each underscore must be surrounded by at least one digit.
large = 1_000
verylarge = 5_349_221 # fractional
float = +1.0
float_pi = 3.1415
negative_float = -0.01 # exponent
flt4 = 5e+22
flt5 = 1e6
flt6 = -2E-2 # both
flt7 = 6.626e-34

YAML

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

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

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

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

TOML

bool1 = true
bool2 = false date1 = 1979-05-27T07:32:00Z
date2 = 1979-05-27T00:32:00-07:00
date3 = 1979-05-27T00:32:00.999999-07:00

YAML

bool1: true
bool2: false null1: null
null2: ~ date_iso: 2016-12-14T21:59:43.10-05:00 # ISO-8601
date_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吧。

深入对比TOML,JSON和YAML的更多相关文章

  1. Java 常见数据交换格式——xml、json、yaml

    目录 数据交换格式介绍 XML 使用DOM方式解析 使用SAX方式解析 使用DOM4J方式解析 使用JDOM方式解析 JSON 使用JSONObject方式将数据转换为JSON格式 利用JSONObj ...

  2. Python常用配置文件ini、json、yaml读写总结

    开发项目时,为了维护一些经常需要变更的数据,比如数据库的连接信息.请求的url.测试数据等,需要将这些数据写入配置文件,将数据和代码分离,只需要修改配置文件的参数,就可以快速完成环境的切换或者测试数据 ...

  3. REST easy with kbmMW #24 使用kbmMW实现JSON/XML/YAML转换成对象

    你想过没有,把一个给定的xml或json生成一个Delphi类,并通过这个类完成对xml或json的读写操作吗? 不管有没有,现在kbmMW为我们实现了,看下面这行代码: var s:string; ...

  4. 开源 JSON 库解析性能对比( Jackson / Json.simple / Gson )

    Json 已成为当前服务器与 web 应用之间数据传输的公认标准. 微服务及分布式架构经常会使用 Json 来传输此类文件,因为这已经是 webAPI 的事实标准. 不过正如许多我们习以为常的事情一样 ...

  5. golang multiconfig 示例

    参考资料:https://github.com/koding/multiconfig 测试代码: package main import ( "fmt" "github. ...

  6. 相同内容 yaml 与 json 格式对比

    关联数组: yaml person: name: 张三 age: 24 json { "person": { "name": "张三", . ...

  7. yaml,json,ini这三种格式用来做配置文件优缺点

    适合人类编写:ini > toml > yaml > json > xml > plist可以存储的数据复杂度:xml > yaml > toml ~ jso ...

  8. YAML & JSON &XML如何选择

    前言 本文翻译https://www.csestack.org/yaml-vs-json-vs-xml-difference/,下文会针对当前现有的数据序列化语言做下梳理.重点突出YAML是什么,优缺 ...

  9. XML和JSON数据格式对比

    概念 XML 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语 ...

随机推荐

  1. Java:在不同界面样式下JPopupMenu与鼠标事件mousePressed表现的结果不同!

    今天遇到一个郁闷的事儿: 在一个JFrame上放了一个JList元件,这个JList元件添加了鼠标事件: mouseReleased.mousePressed ... 其中,在mouseRelease ...

  2. Qsort(c)_Sort(c++)用法

    Sort函数(c) (来自codeblocks) stdlib.h _CRTIMP void __cdecl qsort(void*, size_t, size_t, int (*)(const vo ...

  3. Ubuntu下安装tftp

    用户可以在主机系统联网的情况下,在终端输入下面命令进行安装: vmuser@Linux-host: ~$ sudo apt-get install tftpd-hpa tftp-hpa 配置 TFTP ...

  4. Spring Boot Actuator的端点

    Spring Boot Actuator的关键特性是在应用程序里提供众多Web端点,通过它们了解应用程序 运行时的内部状况.有了Actuator,你可以知道Bean在Spring应用程序上下文里是如何 ...

  5. JQuery实现轮播图及其原理

    源码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" name="vi ...

  6. 【1】【JUC】JDK1.8源码分析之ArrayBlockingQueue,LinkedBlockingQueue

    概要: ArrayBlockingQueue的内部是通过一个可重入锁ReentrantLock和两个Condition条件对象来实现阻塞 注意这两个Condition即ReentrantLock的Co ...

  7. git常用命令及含义

    Git和SVN是我们最常用的版本控制系(Version Control System, VCS),当然,除了这二者之外还有许多其他的VCS,例如早期的CVS等.顾名思义,版本控制系统主要就是控制.协调 ...

  8. Spark2.1.0编译

    1.下载spark源码包 http://spark.apache.org/downloads.html 2.安装Scala与maven,解压spark源码包 安装Scala: tar zxf scal ...

  9. OracleHelper与SqlServerHelper

    1.OracleHelper using System; using System.Data; using System.Configuration; using System.Linq; using ...

  10. sql 把多列内容合并

    这个语句不完整.应该是这样:stuff(select ',' + fieldname  from tablename for xml path('')),1,1,'') as ’别名‘这一整句的作用是 ...