為Java開發者對YAML文件格式做一個高級介紹找出它與XML和JSON的不同之處並檢驗它的優越性和缺陷
所有動態語言(如RubyGroovyPython等)及其相關的框架(如Ruby on rails)百家爭鳴盡管閱讀本文的大部分Java開發者每天的大多數工作都是處理純粹的Java且未來多年都將如此但這並不意味著他們不能學習新的知識在他們的兵器庫中添加新的兵器本文介紹YAML(YAML不是標記語言的簡寫)文件格式(使用Ruby on rails框架進行講解因為它所有的配置文件都是使用的YAML)以及它與XML和JSON的區別最後討論了YAML的優勢和缺點
空格縮進和JSON選項
YAML文件格式主要集中於空格縮進的概念它用於指出數據的層次結構 – 而不是使用XML嵌套標記或JSON的大括號({})和方括號([])實際上它是JSON的一個超集因此在使用的時候你可能需要采用JSON風格的語法來跳出空格流它的創始人將其形容為為所有編程語言提供人性化的數據序列化標准以我的經驗來看其重點是人性化
下面是一個使用空格縮進的YAML樣例創建YAML文件時不宜使用固定寬度字體因為空格是很關鍵的(參考側邊欄YAML和標簽
JFrame:
defaultCloseOperation: JFrameEXIT_ON_CLOSE
title: Test Frame
width:
height:
components:
JTextArea:
name: textArea
text: |
This is a really long text
that spans multiple lines (but preserves new lines)
It does not need to be escaped with special brackets
CDATA tags or anything like that
JButton:
name: button
text: Button
側邊欄YAML和標簽
基於空格縮進的任一文件格式最常見的問題之一是如何解釋標簽在這個YAML例子中答案相當簡單它不支持標簽使用標簽字符縮進代替空格將會導致處理異常
隨你喜歡你可以在任何節點使用JSON風格語法或混合語法例如上面的例子可改為
JFrame:
defaultCloseOperation: JFrameEXIT_ON_CLOSE
title: Test Frame width:
height:
components:
JTextArea:
name: textArea
text: |
This is a really long text
that spans multiple lines (but preserves new lines)
It does not need to be escaped with special brackets
CDATA tags or anything like that
JButton: {name: button text: Button } #JSON風格語法
在底層節點(即它們沒有子節點正如你猜測的那樣井號鍵在YAML中是用來注釋的)切換使用JSON風格語法顯得特別有用
YAML結構組件
前面已經看了一個簡單的YAML例子下面讓我們一起來了解一下YAML的結構hashlist和block literal
hash(散列)
通過縮進子段和在關鍵字與值之間使用冒號(:)來分割實現hash的創建如
JFrame:
defaultCloseOperation: JFrameEXIT_ON_CLOSE
title: Test Frame
width:
height:
還有一種方法就是使用與JSON兼容的大括號語法({})語法每一對關鍵字/值使用逗號()分割如
JFrame: {defaultCloseOperation: JFrameEXIT_ON_CLOSE title: Test Frame
width: height: }
list(清單)
通過在每個list元素前放一個減號()來創建list與空格縮進一起構成了YAML的基石
components:
JTextArea
Jbutton
還有一種方法就是使用JSON兼容的方括號([])語法如
components: [JTextArea JButton]
block literal(文字塊)
這是YAML的亮點特別是與XML相比它的CDATA顯得相當簡陋block literal可以將大塊文本細致地插入文件中你可以使用豎線(|)指令在你的文本中保留新行如
text: |
This is a really long text
that spans multiple lines (but preserves new lines)
It does not need to be escaped with special brackets
CDATA tags or anything like that
YAML編譯器將會從第一行的第一個文本字符開始編譯(並丟掉所有的縮進空格)但是會在你的文本中保留新行
另外你還可以使用大於符號(>)告訴YAML編譯器給所有新行加上條紋並將輸入的文本作為一個長行處理
text: >
This is a really long text
that spans multiple lines (but preserves new lines)
It does not need to be escaped with special brackets
CDATA tags or anything like that
除了這兩個指令之外你還可以使用豎線和加號(|+)它給位於前面的空格加上條紋保留新行和末尾的空格還可以使用大於號和減號(>)它給所有的空格加上條紋
YAML VS XML和JSON
正如你從前面例子中清楚地看到那樣YAML沒有XML那麼啰嗦了大部分YAML文件內容就是真實的數據沒有了無窮盡的打開和關閉標記列表在XML中這些標記往往比它們描述的數據還大YAML更適合你需要手工維護的數據文件類型
YAML沒有提供方案或DTD概念因此無法驗證文件格式是否符合你的預期XML的啰嗦也有它的價值但總的說來是因為XML的成熟使它具有大量額外的工具來驗證它的格式而YAML還沒有
JSON也適合與任何數據它主要面向提高性能和文件尺寸的大小因為它幾乎不使用空格和關閉標簽然而JSON文件的內容增加了復雜性它的關閉標識就象下地獄一樣這就是JavaFx代碼(它基於JSON)中可見的最痛苦的了在數據文件中使用UI結構使結果更復雜其復雜程度幾乎使文件變得無法理解
查看的JavaFx示例代碼(點擊Edit this page鏈接)請特別留心它是如何結束的
}
}
}
}
]
}
}
center: bookPanel
}
摻和了{}結構和[]清單使得手工維護大型的JSON風格的文件變得相當困難YAML使用它的空格縮進方法巧妙地解決了這個問題當然無論何時你都可以切換到JSON風格的語法(如在底層節點)
解析YAML文件最常用的Java庫是JvYAML()JRuby(在Java VM上運行動態語言的Ruby版本)在它的Ruby on Rails框架中的進出口使用JvYAMLJvYAML提供了文件一般處理的功能(在前面那個例子中它返回了一個標准Java字符串LongMap和List對象的嵌套體系結構)使用靜態dump()方法保存為文件然後使用靜態load()方法載入例如
YAMLdump(Object data Writer output);
Object data = YAMLload(Reader io);
參考側邊欄基於YAML的開源項目了解關於基於YAML的開源項目信息以及如何在Java中裝入一個說明的UI
側邊欄基於YAML的開源項目
請原諒我在這裡厚臉皮地介紹我們自己的開源項目當我真的不知道除了JRuby外其他的基於YAML的開源項目JRuby的Ruby on Rails框架實現嚴重依賴YAML而不是XML或JSON看看我的Java Builder庫吧()它利用YAML文件提供了一種方法定義屏幕控制布局事件線路和數據綁定以實現將說明UI裝入Java
實際上YAML文件真的非常簡單甚至你可以使用任何的文本編輯器都可以維護它但有些專門的文本編輯器提供了語法加亮功能這對維護工作很有幫助對Eclipse而言有Eclipse YAML editor()對NetBeans而言你可以使用來自Ruby包()的YAML編輯器然而在NetBeans 中的YAML編輯器並沒有什麼用處它只支持YAML很小的一個子集(例如它不支持block literal)希望在NetBeans 中的YAML編輯器解決了這個問題
我沒有機會測試IntelliJ IDEA但我推測它的Ruby on Rails插件
(+IDEA+Ruby+Plugin)附帶了YAML編輯器
添加YAML工具
過分啰嗦的XML格式大多數情況下都是重復的YAML和來自Java的用法在你的下一個項目中應該作為一個可選的非常棒的選擇在未來的學習中請訪問YAML的WiKi頁面()它對YAML的高級特性如數據合並和數據計算有非常優秀的描述也可以訪問YAML的官方站點()
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19416.html