配置文件写法——常用数据格式TOML,JSON和YAML对比

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

您可以 将所有这三种数据格式用于配置,前置事项和自定义数据 但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吧。

参考链接:https://blog.csdn.net/paladinzh/article/details/88951763

https://chilaidashi.blog.csdn.net/article/details/120220469?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Node.js中,可以使用toml模块来解析和生成toml格式配置文件,因此可以通过Node.js来实现点击修改toml格式配置文件的功能。以下是一般的实现思路: 1. 创建一个API接口,用于接收来自客户端的修改请求,并将修改后的内容写入配置文件。 2. 在客户端使用Ajax或Fetch等技术,向服务器端发送修改请求。请求的参数可以包括要修改的配置项名称和修改后的值。 3. 在服务器端接收到修改请求后,使用toml模块读取配置文件的内容,并将修改后的内容写入到文件中。这里需要注意的是,要保证对文件的写入操作是安全的,需要进行一些权限控制和错误处理。 4. 返回修改结果给客户端,通常会返回一个布尔值或者一些错误信息,以便客户端进行下一步处理。 下面是一个简单的示例代码,用于修改toml格式配置文件: ``` const fs = require('fs'); const toml = require('toml'); // 定义API接口,用于接收修改请求 app.post('/api/config', (req, res) => { const { key, value } = req.body; // 获取请求参数 // 读取配置文件 const config = toml.parse(fs.readFileSync('config.toml', 'utf8')); // 修改配置项的值 config[key] = value; // 将修改后的内容写入文件 fs.writeFileSync('config.toml', toml.stringify(config)); // 返回修改结果 res.json({ success: true }); }); ``` 需要注意的是,由于涉及到文件操作,需要特别小心防止文件损坏或数据丢失。因此,在实现过程中需要使用一些安全的技术和方法来保证文件的完整性和安全性,例如备份、加锁、权限控制等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值