程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 超越XML和JSON:YAML,Java開發人員的新選擇

超越XML和JSON:YAML,Java開發人員的新選擇

編輯:關於JAVA

所有動態語言(如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/)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved