首页 > 其他分享 >YAML 与 JSON、XML 比较及 YAML 使用最佳实践

YAML 与 JSON、XML 比较及 YAML 使用最佳实践

时间:2024-09-13 11:24:12浏览次数:3  
标签:XML name 嵌套 YAML JSON position 数据交换

YAML(YAML Ain't Markup Language的递归缩写)是一种人类可读的数据序列化格式,通常用于配置文件、数据交换和设置管理。它简洁且易于读写,尤其适合在编程语言之间传递配置数据。以下是一些YAML的基本概念和语法示例:

基本语法

  1. 键值对
name: John Doe
age: 30
  1. 嵌套
person:
  name: John Doe
  age: 30
  address:
    street: 123 Main St
    city: Anytown
  1. 列表
fruits:
  - Apple
  - Banana
  - Cherry
  1. 复合数据结构
employees:
  - name: Alice
    position: Developer
  - name: Bob
    position: Designer
  1. 注释
# This is a comment
name: John Doe  # This is also a comment
  1. 多行字符串
description: |
  This is a multi-line string.
  It preserves line breaks.
description: >
  This is a folded multi-line string.
  Newlines are replaced with spaces.

使用场景

  1. 配置文件:YAML 常用于应用程序的配置文件,例如 Docker、Kubernetes、CI/CD 管道等。
  2. 数据交换:YAML 可以用于不同系统间的数据交换,提供了一种比 JSON 更加友好的方式来表示数据结构。
  3. 数据表示:例如,某些 API 使用 YAML 来定义数据格式和接口规范。

示例

以下是一个更复杂的 YAML 示例,展示了如何定义一个包含多层嵌套和列表的数据结构:

company:
  name: TechCorp
  location: Silicon Valley
  departments:
    - name: Engineering
      employees:
        - name: Alice
          position: Senior Developer
          skills:
            - Python
            - Docker
        - name: Bob
          position: Junior Developer
          skills:
            - JavaScript
            - Kubernetes
    - name: Marketing
      employees:
        - name: Carol
          position: Marketing Manager
        - name: Dave
          position: SEO Specialist

总结

YAML 是一种灵活且易读的格式,适合用于配置、数据交换和数据表示。通过简单的语法,它可以清晰地表达复杂的数据结构,使得开发和维护工作更加高效。


YAML 与 JSON 的主要区别和优缺点

区别:
  1. 可读性
  • YAML:更加人类友好,支持多行字符串和注释,结构更接近自然语言。
  • JSON:简洁但没有注释功能,所有数据都必须在一行内表示。
  1. 数据结构
  • YAML:支持复杂的嵌套结构,能够更好地表示复杂的对象。
  • JSON:主要用于表示简单的对象和数组,复杂的嵌套结构可能显得较为冗长。
  1. 语法
  • YAML:使用缩进表示层级,支持锚点和引用,能够减少重复数据。
  • JSON:使用花括号 {} 和方括号 [] 表示对象和数组,结构更严格。
  1. 注释
  • YAML:支持注释,用 # 表示。
  • JSON:不支持注释。
优缺点:
  • YAML 优点:可读性强,支持注释,适合用于配置文件和复杂的数据结构。
  • YAML 缺点:语法较为复杂,容易产生解析错误,性能较 JSON 稍差。
  • JSON 优点:语法简单,解析速度快,广泛应用于数据交换和存储。
  • JSON 缺点:不支持注释,可读性和结构表达能力相对较弱。

如何在 YAML 中表示复杂的嵌套结构

YAML 使用缩进来表示层级关系,因此可以很自然地表示复杂的嵌套结构。下面是一个示例:

company:
  name: TechCorp
  departments:
    - name: Engineering
      employees:
        - name: Alice
          position: Senior Developer
          skills:
            - Python
            - Docker
        - name: Bob
          position: Junior Developer
          skills:
            - JavaScript
            - Kubernetes
    - name: Marketing
      employees:
        - name: Carol
          position: Marketing Manager
        - name: Dave
          position: SEO Specialist

YAML 支持的数据类型

  • 标量:字符串、整数、浮点数、布尔值。
  • 集合:映射(键值对)、序列(列表)。
  • 特殊类型:日期、时间、Null(空值)。

如何在 YAML 中使用引用和锚点

YAML 支持使用锚点(&)和引用(*)来避免数据重复:

defaults: &defaults
  color: red
  size: medium

item1:
  <<: *defaults
  name: Item 1

item2:
  <<: *defaults
  name: Item 2
  size: large

YAML 的安全性问题及防范措施

  • 安全问题
  • 代码执行:恶意 YAML 可能执行任意代码。
  • 资源耗尽:复杂的嵌套可能导致资源耗尽。
  • 防范措施
  • 禁用不安全的功能:避免使用 YAML 解析器的任意代码执行功能。
  • 限制复杂性:限制 YAML 文件的嵌套深度和大小。

YAML 文件的最佳实践

  1. 保持简洁:避免过度嵌套和复杂的数据结构。
  2. 使用注释:清晰地记录配置和数据含义。
  3. 遵循规范:确保缩进一致,避免使用制表符(tab)。
  4. 版本控制:将 YAML 文件纳入版本控制,以便跟踪更改。

如何在 YAML 文件中处理多行文本

  • 保留换行
description: |
  This is a multi-line string.
  It preserves line breaks.
  • 折叠换行
description: >
  This is a folded multi-line string.
  Newlines are replaced with spaces.

YAML 与 XML 的比较

  • 可读性
  • YAML:更易读,更接近自然语言。
  • XML:标记语言,结构化但冗长。
  • 语法
  • YAML:简洁,不需要标签。
  • XML:使用开始标签和结束标签,结构较重。
  • 数据处理
  • YAML:适合用于配置和数据交换。
  • XML:适合文档存储和数据交换,支持复杂的命名空间。

在大规模系统中,YAML 的性能表现

  • 解析性能:通常比 JSON 稍慢,但在可读性和数据表达能力上有优势。
  • 优化:可通过优化解析器和限制文件大小来提升性能。

YAML 在不同编程语言中的解析库

  • Python:PyYAML
  • JavaScript:js-yaml
  • Java:SnakeYAML
  • Ruby:YAML(内置于标准库)
  • Go:go-yaml

如何在 YAML 中定义和使用自定义数据类型

YAML 允许通过标签来定义自定义数据类型:

!my_custom_type
value: 123

解析器需要相应的自定义解析器来处理这些自定义类型。

YAML 文件的格式化工具

  • 在线工具:yaml-online-parser、codebeautify.org
  • 本地工具:prettier、yamllint

YAML 与其他配置语言(如 TOML、INI)的比较

  • TOML:简洁,适合配置文件,支持表格和数组。
  • INI:简单,适合传统配置,功能有限。

如何处理 YAML 文件中的错误和异常

  • 验证工具:使用 YAML 校验工具(如 yamllint)检查语法错误。
  • 异常处理:在解析过程中捕获异常,提供清晰的错误信息。

在容器化环境(如 Docker)中,如何有效使用 YAML 文件进行配置

  • Docker Compose:使用 YAML 文件定义服务、网络和卷。
  • 示例
version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

标签:XML,name,嵌套,YAML,JSON,position,数据交换
From: https://blog.51cto.com/yingnanxuezi/11999875

相关文章

  • dotnet OpenXML SDK 添加 CoreFilePropertiesPart 的方法
    本文记录在OpenXMLSDK2.15版本下,为PPTX文件添加CoreFilePropertiesPart的方法,通过本文的方法可以正确且简单的添加core.xml文件到PPTX文件里当前的OpenXMLSDK存在已知问题,那就是默认情况下生成不包含core.xml文件,请参阅https://github.com/dotnet/Open-XML-SDK......
  • 面试-JS Web API-JSONP和cors
    JSONP(JSONwithPadding)JSONP是通过<script>标签来实现跨域数据传输的技术。它是为了绕过浏览器的同源策略限制而诞生的。访问一个网址,服务端一定返回一个html文件吗?---不是的服务器可以任意动态拼接数据返回的,只要符合html格式的要求就可以。JSONP的工作原理:客......
  • json数据解析
    Stringdata="{json}";ObjectMapperobjectMapper=newObjectMapper();JsonNoderootNode=null;try{rootNode=objectMapper.readTree(data);//通过将String类型的json数据转化为JsonNode对象}catch(JsonPr......
  • PbootCMS生成的sitemap.xml中增加tag标签链接
    //指定分类标签调用publicfunctiongetSortTags($scode){$join=array(array('ay_content_sortb','a.scode=b.scode','LEFT'),array('ay_modelc......
  • Mybatis读取和存储json类型的数据
    目录一、测试使用JSONObject来获取json二、设置@TableName的autoResultMap为true,@TableField的typeHandler为JacksonTypeHandler.class三、设置xml当中的resultMap四、JacksonTypeHandler讲解五、新增假如是JSONObject异常问题六、遇到转义的问题不管数据库当中是以json还是longte......
  • JsonConfigurationFileParser
    internalclassProgram{staticasyncTaskMain(string[]args){varroot=newRoot{Demo1=newDemo1{Name="Demo1",Data=newDemo2{Name="Demo2"......
  • fastjson1.2.24反序列化漏洞复现 CVE-2017-18349
    1.准备:1.1复现环境漏洞环境:vulnhub靶场工具准备:jdk8,apache-maven-3.9.9,kali2024.1,MarshalSec1.2环境启动进入vulnhub目录下的fastjson目录,进入CVE-2017-18349目录cd/home/hbesljx/vulhub/fastjson/1.2.24-rcedocker-compoe启动漏洞环境docker-composeup-d访问靶机......
  • 微信小程序开发系列7----页面配置--WXML的include用法
       传递变量   模板不能引用 ......
  • vue3 使用 codemirror 实现yaml文件的在线编辑
    vue3使用codemirror实现yaml文件的在线编辑1.使用情形2.插件下载3.封装yaml编辑器组件4.父组件使用5.js-yaml使用6.备注1.使用情形需要对yaml文件进行在线编辑,并且进行基础格式验证2.插件下载vue-codemirror在线代码编辑器插件js-yaml用于转换jso......
  • logback-spring.xml
    <?xmlversion="1.0"encoding="UTF-8"?><configurationdebug="true"><includeresource="org/springframework/boot/logging/logback/defaults.xml"/><springPropertyname="TRACK_PATH&quo......