1. 程式人生 > >超越XML和JSON:YAML

超越XML和JSON:YAML

為Java開發者對YAML檔案格式做一個高階介紹,找出它與XML和JSON的不同之處,並檢驗它的優越性和缺陷。

所有動態語言(如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結構使結果更復雜,其複雜程度幾乎使檔案變 得無法理解。

}
}
}
}
]
}
}
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編輯器解決了這個問題。

新增YAML工具

過分囉嗦的XML格式大多數情況下都是重複的,YAML和來自Java的用法在你的下一個專案中應該作為一個可選的非常棒的選擇,在未來的學習中,請訪問YAML的WiKi頁面(http://en.wikipedia.org/wiki/YAML),它對YAML的高階特性如資料合併和資料計算有非常優秀的描述,也可以訪問YAML的官方站點(http://www.yaml.org/)。

相關推薦

超越XMLJSONYAML

為Java開發者對YAML檔案格式做一個高階介紹,找出它與XML和JSON的不同之處,並檢驗它的優越性和缺陷。 所有動態語言(如Ruby,Groovy,Python等)及其相關的框架(如Ruby on rails)百家爭鳴,儘管閱讀本文的大部分Java開發者每天的大多數工作都

安卓客戶端開發XMLJSON兩種資料交換格式的比較

最近想給網站做客戶端,因此在考慮到底是用xml還是Json的問題,剛好在網上讀到了這篇文章。 目前,在web開發領域,主要的資料交換格式有XML和JSON,對於XML相信每一個web  developer都不會感到陌生;相比之下,JSON可能對於一些新步入開發領

C/C++使用libcurl庫發送http請求(getpost可以用於請求html信息,也可以請求xmljson等串)

網絡連接 get 編譯 eas views vs2015 return tar linux C++要實現http網絡連接,需要借助第三方庫,libcurl使用起來還是很方便的 環境:win32 + vs2015 如果要在Linux下使用,基本同理 1,下載

SpringBoot RestController 同時支持返回xmljson格式數據

獲取json 需要 tid stc style pre cati 返回json provide @RestController 默認支持返回json格式數據,即使不做任何配置也能返回json數據 當接口需要支持xml或json兩種格式數據時應該怎麽做呢? 只要引入 Jack

c#中 xmljson 互相轉換

XML serialize AD -- ldo data nod load str --xml轉json XmlDocument doc = new XmlDocument(); doc.LoadXml(result); st

HTML、XMLJSON學習匯總

web 文檔類型 first key 方法 min 兩個 第一步 實驗 1. HTML語言 2. XML語言 2.1 XML的特點 2.2 XML與HTML的主要差異: 2.3 XML允許自定義標簽 2.4 XML的解析 3. JSON語言 3.1 JSON的語法規則

XMLJSONYAML 三種資訊標記形式的比較

XML:最早的通用資訊標記語言,可擴充套件性好,但繁瑣。 JSON:資訊有益型,適合程式處理(javascript),較xml簡潔。 YAML:資訊無型別,文字資訊比例最高,可讀性好。 XML:Extensible Markup Language(<,>,^,/,? 

XML json 解析比較

1. 定義 XML,即 extensible Markup Language ,是一種資料標記語言 & 傳輸格式 2. 作用 對資料進行標記(結構化資料)、儲存 & 傳輸 區別於 html :html用於顯示資訊;而 XML用於儲存&傳輸資訊

實現xmljson格式資料——單例模式的Db類(第二篇)

       上一篇只是實現了xml和json格式資料的類的封裝,不過它是沒有資料的來源的;因此,本篇文章是封裝一個呼叫資料庫資料的方法,視訊裡面用的是mysql_connect()等函式,不過現在用這些函式會出現notice,因為這些函式已經過時了,將來可能不會再用到;其實

JavaSE(十一)Maven、XMLJSON

Maven、XML和JSON Maven 依賴管理 構建流程 使用外掛 模組管理 XML和JSON Maven Maven是一個Java專案管理和構建的工具 Maven使用pom.xml定義專案

HTML、XMLJSON的關係

{ "people": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, { "firstName": "Jason", "lastName":"Hu

Vczh Library++3.0開發紀事之流式xmljson讀寫

    每次完成一個任務的時候,都要看看有沒有什麼潛在的可以把功能是現成庫的地方。這十分有利於提高自己的水平。但至於你寫出來的庫會不會有人用,那是另一回事情了。     這次為了完成一個多程式語言+多自然語言的文件編寫工具,不得不做一個可以一次生成一大批文字檔案的模板結構出來。有了模板必然有元資

資訊標記與提取方法(XMLJSONYAML

資訊標記         實際應用中的原始資料往往是雜亂無章的,為了更加方便組織和儲存各種資訊,以及為計算機處理、傳播訊息提供一種統一的方法。必須對資訊進行一定的標記,資訊標記的特點一般有以下幾點:

Android:解析伺服器響應的XMLJSON(包括伺服器SSM搭建)

安卓APP要實現很多功能(比如登入註冊、發表評論等)時都必須要使用到網路資料互動。所以在學習了這部分內容後,就將其以拿一個物件為例整理出來。伺服器用的是SSM(SpringMVC、Spring、MyBatis)集合框架,返回響應資料格式為兩種xml、json,下

JS實現xmljson(也可看做物件)互轉

最近有個前端的需求: 解析後臺xml, 並新增刪除和修改, 然後傳給後臺, 思來想去, 最簡單的辦法就是利用xml和物件互轉, 即從後臺讀取xml傳到前臺並形成表格(已有程式碼,或者用物件生成表格), 前臺可編輯表格(包括新增,刪除),提交時將表格資料存入物件中

jaxb實現xml json 之間的轉換

jaxb2 實體類轉xml: public static String toXML(Object obj, String encode, boolean format, boolean fragm

常用資料格式xmljson解析

jsoup xml格式資料原生解析有pull和sax兩種方式,主要是有兩個不同的工廠類XmlPullParserFactory和SaxParserFactory。 介紹一種框架解析jsoup。 /* * 1.使用 Jsoup 載入 H

安卓開發之解析XMLJSON格式資料

參考書作者:郭霖我會將所學的知識簡單記錄下來以便於大家快速查閱資料,另外郭霖大俠沒有提到的東西我也會作出補充我們通常情況下,每個需要訪問網路的應用程式都會有一個自己的伺服器,我們可以向伺服器提交資料,也可以從伺服器上獲取資料。在網路上傳輸資料時最常用的格式用兩種:XML和JS

xmlJSON相互轉換的Java實現

依賴的包: json-lib-2.4-jdk15.jar ezmorph-1.0.6.jar xom-1.2.1.jar commons-lang-2.1.jar commons-io-1.3.2.jar jaxen-1.1.jar 輸入xml檔案,輸出JSON物件 Java程式碼   pa

資料交換格式之XMLJSON

學習知識點XML和JSON一、什麼是資料交換格式客戶端與伺服器常用資料交換格式xml、json、html二、資料交換格式應用場景移動端(安卓、IOS)通訊方式採用http協議+JSON格式走restful風格。很多網際網路專案都採用Http協議+JSON因為xml比較重Web