YAML-學習筆記!

YAML學習筆記

一、YAML簡介

YAML,即YAML Ain’t Markup Language的縮寫,YAML 是一種簡潔的非標記語言。YAML以數據為中心,使用空白,縮進,分行組織數據,從而使得表示更加簡潔易讀。

二、YAML語法

1、基本規則

YAML有以下基本規則:

  1. 大小寫敏感
  1. 使用縮進表示層級關系
  2. 禁止使用tab縮進,只能使用空格鍵
  3. 縮進長度沒有限制,只要元素對齊就表示這些元素屬于一個層級。
  4. 使用#表示注釋
  1. 字符串可以不用引號標注

2、數據類型

  1. 字符串
#YAML
str: abc
#JSON
{str:'abc'
}
#YAML
#包含特殊字符需要加引號
str: '內容:字符串'
#JSON
{ str:'內容:字符串'
}
#YAML
#單雙引號均可,雙引號不會對特殊符號轉義
s1: '內容\n字符串'
s2: "內容\n字符串"
#JSON
{s1:'內容\\n字符串',s2:'內容\n字符串'
}
  1. 布爾值
    布爾值用truefalse表示
#YAML
isTrue: true
isTrue: false
#JSON
{isTrue:true,isTrue:false
}
  1. 整數
    數值直接以字面形式表示
#YAML
int: 10
#JSON
{int:10
}
  1. 浮點數
    數值直接以字面形式表示
float: 1.23
double: 2.34
#JSON
{float:1.23,double:2.34
}
  1. Null
    null值用~表示
#YAML
person: ~
{person:null
}
  1. 時間
    時間采用ISO8601格式表示
#YAML
iso8601: 2018-05-20t10:59:43.10-05:00
#JSON
{iso8601:new Date('2018-05-20t10:59:43.10-05:00')
}
  1. 日期
    日期采用ISO8601的格式yyyy-MM-dd表示
#YAML
date: 2018-05-20
{date:new Date('2018-05-20')
}

注:YAML允許使用兩個感嘆號強制轉換類型

#YAML
str1: !!str 123
str2: !!str true
#JSON
{str1:'123',str2:'true'
}

3、數據結構

1. Map,散列表
使用:表示鍵值對,統一縮進的所有鍵值對屬于一個Map

name: John
age: 18
#也可以寫在一行
{ name: John, age: 18}
#JSON
{'name':'John','age': 18
}

2、List,數組
使用-來表示數組中的一個元素

#YAML
- a
- b
- c
#也可以寫在一行
[a, b, c]
#JSON
['a', 'b', 'c']

3、scalar,純量
數據的最小單位,不可再分割

4、數據結構的嵌套

YAML中的數據結構可以相互嵌套,嵌套方式有如下幾種:
1、Map嵌套Map

#YAML
websites:YAML: yaml.org Ruby: ruby-lang.org Python: python.org Perl: use.perl.org 
#JSON
{ websites: { YAML: 'yaml.org',Ruby: 'ruby-lang.org',Python: 'python.org',Perl: 'use.perl.org' } }

2、Map嵌套List

#YAML
languages:- Ruby- Perl- Python - c
#JSON
{languages:[ 'Ruby','Perl','Python','c'] 
}

3、List嵌套List

#YAML
-- Ruby- Perl- Python 
- - c- c++- java
#或者
- [Ruby,Perl,Python]
- [c,c++,java]
#JSON
[['Ruby','Perl','Python'],['c','c++','java']
]

4、List嵌套Map

#YAML
-name: Johnage: 18
- name: Lucyage: 16
#JSON
[{'name':'John','age':18},{'name':'Lucy','age':16}
]

三、Java對YAML文件的操作

1、SnakeYAML簡介

SnakeYAML是一個完整的YAML1.1規范Processor,支持UTF-8/UTF-16,支持Java對象的序列化/反序列化,支持所有YAML定義的類型。

2、SnakeYAML依賴添加

在pom文件中加入依賴

<dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.21</version>
</dependency>

3、SnakeYAML的使用方法

1. 建立Person類

import lombok.Data;//lombok為一種Java工具框架@Data
public class Person {private String name;private Integer age;
}

2、建立person.yml文件

# person.yml
!!com.demo.Person {age: 24, name: Adam}

3、讀取并解析YAML文件

  1. <T> T load(InputStream input)
//獲取YAML中的單個對象
@Test
public void testLoadYaml() throws FileNotFoundException {Yaml yaml = new Yaml();File ymlFile = new File(System.getProperty("user.dir") + "/src/main/resources/person.yml");Person person = yaml.load(new FileInputStream(ymlFile));System.out.println(person);
}

輸出結果為:

Person(name=Adam, age=24)

//獲取YAML中的單個對象
@Test
public void testLoadYaml2() throws FileNotFoundException {Yaml yaml = new Yaml();File ymlFile = new File(System.getProperty("user.dir") + "/src/main/resources/person.yml");List<Person> personList = yaml.load(new FileInputStream(ymlFile));System.out.println(personList);
}

輸出結果為:

[Person(name=Adam, age=24), Person(name=Jack, age=24), Person(name=Steve, age=24)]

  1. <T> T loadAs(InputStream input, Class<T> type)
//讀取YAML文件并返回一個對應類的對象
@Test
public void testLoadYaml() throws FileNotFoundException {Yaml yaml = new Yaml();File ymlFile = new File(System.getProperty("user.dir") + "/src/main/resources/person.yml");Person person = yaml.loadAs(new FileInputStream(ymlFile), Person.class);System.out.println(person);
}

輸出結果為:

Person(name=John, age=20)

  1. Iterable<Object> loadAll(InputStream input)
//讀取YAML文件并返回一個Iterable接口的子類
@Test
public void testLoadAllYaml() throws FileNotFoundException {Yaml yaml = new Yaml();File ymlFile = new File(System.getProperty("user.dir") + "/src/main/resources/person.yml");Iterable<Object> people = yaml.loadAll(new FileInputStream(ymlFile));for (Object person : people) {System.out.println(person);}
}

輸出結果為:

[{name=John, age=20}, {name=Steven, age=30}, {name=Jenny, age=18}]

  1. void dump(Object data, Writer output)
//將POJO寫入YAML文件
@Test
public void testDumpYaml() throws IOException {Yaml yaml = new Yaml();File ymlFile = new File(System.getProperty("user.dir") + "/src/main/resources/person.yml");Person person = new Person();person.setName("Adam");person.setAge(24);yaml.dump(person, new FileWriter(ymlFile));
}

輸出結果為:

!!com.liheng.demo.Person {age: 24, name: Adam}
注:dump方法會將YAML文件中的數據覆蓋

  1. void dumpAll(Iterator<? extends Object> data, Writer output)
//通過Iterator迭代器批量寫入YAML文件
@Test
public void testDumpAllYaml() throws IOException {Yaml yaml = new Yaml();File ymlFile = new File(System.getProperty("user.dir") + "/src/main/resources/person.yml");Iterable<Object> people = yaml.loadAll(new FileInputStream(ymlFile));List<Person> personList = Lists.newArrayList();for (Object person : people) {LinkedHashMap map = (LinkedHashMap) person;Person p = new Person();p.setName((String) map.get("name"));p.setAge((Integer) map.get("age"));personList.add(p);}yaml.dumpAll(personList.iterator(), new FileWriter(ymlFile));
}

輸出結果為:

!!com.liheng.demo.Person {age: 20, name: John}
--- !!com.liheng.demo.Person {age: 30, name: Steven}
--- !!com.liheng.demo.Person {age: 18, name: Jenny}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457110.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CentOS遠程監控

近日&#xff0c;因工作需要&#xff0c;學習了CentOS遠程監控的水平有限&#xff0c;多指教。 遠程訪問CentOS&#xff0c;包括三種方式ssh&#xff0c;telnet&#xff0c;vnc。 本例涉及的是以vnc遠程訪問CentOS。指令在root下操作。注意&#xff1a;vnc的端口為5900&#xf…

aix oracle 10.2.0.1 升級 10.2.0.4,AIX Oracle RAC 升級到10.2.0.4.0要特別注意的問題 - 愛肯的專欄 ......

AIX Oracle RAC 升級到10.2.0.4.0過程有如下報錯(直接升級到10.2.0.4不需要應用Patch:6160398)&#xff1a;rootbwgl_db2:/u01/app/oracle/crs_1/bin# /u01/app/oracle/crs_1/install/root102.shError : Please change the CRS_ORACLE_USER id to have the following OS capabi…

將文件提交到github的兩種方法

方法一 簡要步驟如下&#xff1a; 登陸github&#xff0c;創建git倉庫。記此git倉庫的地址為[github_repository_url]&#xff0c;例如git倉庫的地址&#xff1a;https://github.com/galian123/nodejs_http_server 在本地的工程目錄執行git init&#xff0c;此工程目錄是要提…

Visual Studio 2017新版發布,極大提高開發效率丨附下載

最新的Visual Studio 2017免費下載&#xff1a;https://www.evget.com/product...【包含Professional、Enterprise、Community版本】 為任何開發、應用和平臺提供無與倫比的效率&#xff0c;Visual Studio 2017 候選發布。 提高了效率 代碼導航、IntelliSense、重構、代碼修復和…

BGP路由協議詳解(完整篇)

原文鏈接&#xff1a;http://xuanbo.blog.51cto.com/499334/465596/ 2010-12-27 12:02:45 上個月我寫一篇關于BGP協議的博文&#xff0c;曾許諾過要完善這個文檔&#xff0c;但因最近的工作和授課很忙&#xff0c;所以沒有時間進行完善。為了實現這個承諾&#xff0c;我在去外…

oracle 備份導出,oracle 怎么備份或導入導出表

exp/imp下面介紹的是導入導出的實例&#xff0c;向導入導出看實例基本上就可以完成&#xff0c;因為導入導出很簡單。數據導出&#xff1a;1 將數據庫TEST完全導出,用戶名system 密碼manager 導出到D:\daochu.dmp中exp system/managerTEST filed:\daochu.dmp fully2 將數據庫中…

GitHub+Hexo搭建自己的Blog之-本地環境部署01

前言 之前我的博客沒有綁自己的域名&#xff0c;一直在github上放著&#xff0c;訪問起來比較麻煩&#xff0c;前陣子在阿里云買了這個域名&#xff0c;配置上之后&#xff0c;就可以通過自己的域名訪問了&#xff0c;有些朋友問我這個博客怎么搭的&#xff0c;用的什么主題&am…

appsettings 連接oracle數據庫,ABP .net core集成訪問Oracle數據庫

1.添加包引用&#xff1a;Microsoft.EntityFrameworkCore.RelationalOracle.EntityFrameworkCore2.重寫DbContext OnModelCreating/// /// 判斷如果是Oracle&#xff0c;需要執行Schema/// /// protected override void OnModelCreating(ModelBuilder modelBuilder){//判斷當前…

Day08-函數(3)

import functools #偏函數 def demo(a,b,c,d):print(a,b,c,d)# def partital_demo(a,b): # demo(a,b,3,4) # partital_demo(1,2)#實現偏函數 # #固定前兩個 # demo functools.partial(demo,5,6) # demo(10,50)# #固定后兩個 # demofunctools.partial(demo,c3,d5) # demo(1…

使用VS2010編譯Qt 5.6.1過程記錄

由于Qt官方發布的Qt 5.6.1二進制安裝包沒有對應VS2010版本的&#xff0c;而我的電腦上只安裝了VS2010&#xff0c;因此只能自己編譯。 本文記錄本人的編譯安裝過程&#xff0c;以及其中遇到的一些問題。 本文使用VS2010 32位編譯Qt 5.6.1。 1. 下載Qt源代碼 Qt源代碼下載地址&…

golang 指針

指針1、簡單的定義一個指針package mainimport "fmt"func main(){var p *inti :2p &ifmt.Println("memory address i:",p) } //執行結果&#xff1a; memory address i: 0xc42000a2e02、打印指針的值package mainimport "fmt"func main(){v…

php防錯處理,更好的PHP錯誤處理

錯誤類型PHP 主要有兩種錯誤&#xff1a;觸發錯誤和異常。其中觸發錯誤大概可以分為&#xff1a;編譯錯誤、引擎錯誤和運行時錯誤&#xff0c;其中前兩個是無法捕獲的&#xff1b;異常都是可以捕獲的&#xff0c;當沒有嘗試捕獲時則會中斷代碼。觸發錯誤可以通過 error_get_las…

Windows安裝Apache注冊服務出現(OS 5)拒絕訪問。 : AH00369: Failed to open the Windows service manager,

windows安裝Apache&#xff0c;注冊服務出現“(OS 5)拒絕訪問。 : AH00369: Failed to open the WinNT service manager..."錯誤 在安裝Apache的時候&#xff0c;我下載的是zip格式&#xff0c;不是msi安裝版&#xff0c;需要自己注冊服務&#xff0c;才能在桌面任務欄里有…

算法與數據結構(三) 二叉樹的遍歷及其線索化(Swift版)

前面兩篇博客介紹了線性表的順序存儲與鏈式存儲以及對應的操作&#xff0c;并且還聊了棧與隊列的相關內容。本篇博客我們就繼續聊數據結構的相關東西&#xff0c;并且所涉及的相關Demo依然使用面向對象語言Swift來表示。本篇博客我們就來介紹樹結構的一種&#xff1a;二叉樹。在…

關于android開發時,發生Error infalting classa com.baidu.mapapi.map.MapView的解決辦法

1.問題描述&#xff1a;百度地圖SDK中 Error&#xff1a; infalting classa com.baidu.mapapi.map.MapView 。 2.解決辦法&#xff1a;通過1個多小時的上網搜索&#xff0c;最終發現很多網友之所以出現這方面的問題有以下幾種原因&#xff1a; &#xff08;1&#xff09;.忘…

c++動態綁定的技術實現

1 什么是動態綁定 有一個基類&#xff0c;兩個派生類&#xff0c;基類有一個virtual函數&#xff0c;兩個派生類都覆蓋了這個虛函數。現在有一個基類的指針或者引用&#xff0c;當該基類指針或者引用指向不同的派生類對象時&#xff0c;調用該虛函數&#xff0c;那么最終調用的…

linux替換某個文件夾下所有文件,Linux 批量查找并替換文件夾下所有文件的內容...

1.批量查找某個目下文件的包含的內容cd etcgrep -rn "查找的內容" ./2.批量替換某個目下所有包含的文件的內容cd etcsed -i "s/查找的內容/替換后的內容/g" grep -rl "查找的內容" ./3.批量查找并替換任意文件夾下的文件內容。sed -i "s/要…

Day09-遞歸

#模擬棧結構 stack [] #壓棧&#xff08;想棧里存數據&#xff09; stack.append("A") print(stack) stack.append("B") print(stack) stack.append("C") print(stack)#出棧&#xff08;在棧里取數據&#xff09; res stack.pop() print("…

java中String相等問題

判斷兩個字符串是否相等的問題。在編程中&#xff0c;通常比較兩個字符串是否相同的表達式是“”,但在java中不能這么寫。在java中&#xff0c;用的是equals(); 例&#xff1a;A字符串和B和字符串比較: if(A.equals(B)){ } 返回true 或false. String 的equals 方法用于比較兩個…

linux proc文件 write的原子性,linux - Linux中writev()系統調用的原子性 - 堆棧內存溢出...

在fs.h找到它&#xff1a;static inline void file_start_write(struct file *file){if (!S_ISREG(file_inode(file)->i_mode))return;__sb_start_write(file_inode(file)->i_sb, SB_FREEZE_WRITE, true);}然后在super.c&#xff1a;/** This is an internal function, p…