zoukankan      html  css  js  c++  java
  • 深入对比TOML,JSON和YAML

     

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

  • 相关阅读:
    java获取web项目下文件夹的路径方法
    The method setCharacterEncoding(String) is undefined for the type HttpServletResponse
    java获取windows和linux下本机ip通用方法
    mysql慢查询日志查找与分析
    struts1 action之间的跳转
    jquery的tap会执行2次的替换办法
    Win7下如何安装切换jdk7和jdk8
    elasticdump
    python hive.py
    Hdfs数据备份
  • 原文地址:https://www.cnblogs.com/sunsky303/p/9208848.html
Copyright © 2011-2022 走看看