所有動態語言(如Ruby,Groovy,Python等)及其相關的框架(如Ruby on rails)百家爭鳴,盡管閱讀本文的大部分Java開發者每天的大多數工作都是處理純粹的Java,且未來多年都將如此,但這並不意味著他們不能學習新的知識,在他們的兵器庫中添加新的兵器,本文介紹YAML(YAML不是標記語言的簡寫)文件格式(使用Ruby on rails框架進行講解,因為它所有的配置文件都是使用的YAML)以及它與XML和JSON的區別,最後討論了YAML的優勢和缺點。
空格縮進和JSON選項
YAML文件格式主要集中於空格縮進的概念,它用於指出數據的層次結構 – 而不是使用XML嵌套標記或JSON的大括號({})和方括號([]),實際上,它是JSON的一個超集,因此,在使用的時候,你可能需要采用JSON風格的語法來跳出空格流,它的創始人將其形容為“為所有編程語言提供人性化的數據序列化標准”,以我的經驗來看,其重點是人性化。
下面是一個使用空格縮進的YAML樣例,創建YAML文件時不宜使用固定寬度字體,因為空格是很關鍵的。(參考側邊欄1:YAML和標簽
JFrame: defaultCloSEOperation: JFrame.EXIT_ON_CLOSE title: Test Frame width: 800 height: 400 components: - JTextArea: name: textArea1 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: button2 text: Button 2
側邊欄1:YAML和標簽
基於空格縮進的任一文件格式最常見的問題之一是如何解釋標簽,在這個YAML例子中,答案相當簡單:它不支持標簽。使用標簽字符縮進代替空格將會導致處理異常。
隨你喜歡,你可以在任何節點使用JSON風格語法或混合語法,例如,上面的例子可改為:
JFrame: defaultCloSEOperation: JFrame.EXIT_ON_CLOSE title: Test Frame width: 800 height: 400 components: - JTextArea: name: textArea1 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: button2, text: Button 2} #JSON風格語法
在底層節點(即它們沒有子節點,正如你猜測的那樣,井號鍵在YAML中是用來注釋的)切換使用JSON風格語法顯得特別有用。
YAML結構組件
前面已經看了一個簡單的YAML例子,下面讓我們一起來了解一下YAML的結構:hash,list,和block literal。
hash(散列)
通過縮進子段和在關鍵字與值之間使用冒號(:)來分割實現hash的創建,如:
JFrame: defaultCloSEOperation: JFrame.EXIT_ON_CLOSE title: Test Frame width: 800 height: 400
還有一種方法就是使用與JSON兼容的大括號語法({})語法,每一對關鍵字/值使用逗號(,)分割,如:
JFrame: {defaultCloSEOperation: JFrame.EXIT_ON_CLOSE, title: Test, Frame,
width: 800, height: 400}
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結構使結果更復雜,其復雜程度幾乎使文件變得無法理解。
查看http://jfx.wikia.com/wiki/JFXPresentation的JavaFx示例代碼(點擊“Edit this page”鏈接),請特別留心它是如何結束的。
} } } } ] } } center: bookPanel }
摻和了{}結構和[]清單,使得手工維護大型的JSON風格的文件變得相當困難,YAML使用它的空格縮進方法巧妙地解決了這個問題,當然,無論何時,你都可以切換到JSON風格的語法(如在底層節點)。
解析YAML文件最常用的Java庫是JvYAML(https://jvyaml.dev.Java.Net/),JRuby(在Java VM上運行動態語言的Ruby版本)在它的Ruby on Rails框架中的進出口使用JvYAML,JvYAML提供了文件一般處理的功能(在前面那個例子中,它返回了一個標准Java字符串、Long、Map和List對象的嵌套體系結構),使用靜態dump()方法保存為文件,然後使用靜態load()方法載入,例如:
YAML.dump(Object data, Writer output); Object data = YAML.load(Reader io);
參考側邊欄2:基於YAML的開源項目了解關於基於YAML的開源項目信息,以及如何在Java中裝入一個說明的UI.
側邊欄2:基於YAML的開源項目
請原諒我在這裡厚臉皮地介紹我們自己的開源項目,當我真的不知道除了JRuby外其他的基於YAML的開源項目,JRuby的Ruby on Rails框架實現嚴重依賴YAML,而不是XML或JSON,看看我的Java Builder庫吧(http://www.Javabuilders.org/),它利用YAML文件提供了一種方法定義屏幕控制、布局、事件線路和數據綁定,以實現將說明UI裝入Java。
實際上,YAML文件真的非常簡單,甚至你可以使用任何的文本編輯器都可以維護它,但有些專門的文本編輯器提供了語法加亮功能,這對維護工作很有幫助,對Eclipse而言,有Eclipse YAML editor(http://code.google.com/p/yamleditor/),對NetBeans而言,你可以使用來自Ruby包(http://www.Netbeans.org/features/ruby/index.Html)的YAML編輯器,然而,在NetBeans 6.1中的YAML編輯器並沒有什麼用處,它只支持YAML很小的一個子集(例如:它不支持block literal),希望在NetBeans 6.5中的YAML編輯器解決了這個問題。
我沒有機會測試IntelliJ IDEA,但我推測它的Ruby on Rails插件
(http://www.jetbrains.Net/confluence/display/RUBYDEV/IntelliJ+IDEA+Ruby+Plugin)附帶了YAML編輯器。
添加YAML工具
過分啰嗦的XML格式大多數情況下都是重復的,YAML和來自Java的用法在你的下一個項目中應該作為一個可選的非常棒的選擇,在未來的學習中,請訪問YAML的WiKi頁面(http://en.wikipedia.org/wiki/YAML),它對YAML的高級特性如數據合並和數據計算有非常優秀的描述,也可以訪問YAML的官方站點(http://www.yaml.org/)。