JSON 數據格式程序員
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。JSON採用徹底獨立於語言的文本格式,這些特性使JSON成爲理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成。
基礎結構
JSON建構於兩種結構:web
基礎示例
簡單地說,JSON 能夠將 JavaScript 對象中表示的一組數據轉換爲字符串,而後就能夠在函數之間輕鬆地傳遞這個字符串,或者在異步應用程序中將字符串從 Web 客戶機傳遞給服務器端程序。這個字符串看起來有點兒古怪,可是 JavaScript 很容易解釋它,並且 JSON 能夠表示比"名稱 / 值對"更復雜的結構。例如,能夠表示數組和複雜的對象,而不只僅是鍵和值的簡單列表。
表示名稱 / 值對
按照最簡單的形式,能夠用下面這樣的 JSON 表示 "名稱 / 值對" :{ "firstName": "Brett" }json
這個示例很是基本,並且實際上比等效的純文本 "名稱 / 值對" 佔用更多的空間:firstName=Brett數組
可是,當將多個"名稱 / 值對"串在一塊兒時,JSON 就會體現出它的價值了。首先,能夠建立包含多個"名稱 / 值對"的 記錄,好比:服務器
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }
從語法方面來看,這與"名稱 / 值對"相比並無很大的優點,可是在這種狀況下 JSON 更容易使用,並且可讀性更好。例如,它明確地表示以上三個值都是同一記錄的一部分;花括號使這些值有了某種聯繫。
表示數組
當須要表示一組值時,JSON 不但可以提升可讀性,並且能夠減小複雜性。例如,假設您但願表示一我的名列表。在 XML 中,須要許多開始標記和結束標記;若是使用典型的 名稱 / 值 對(就像在本系列前面文章中看到的那種名稱 / 值對),那麼必須創建一種專有的數據格式,或者將鍵名稱修改成 person1-firstName這樣的形式。網絡
若是使用 JSON,就只需將多個帶花括號的記錄分組在一塊兒:數據結構
{ "people": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"}, { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" } ]}
這不難理解。在這個示例中,只有一個名爲 people的變量,值是包含三個條目的數組,每一個條目是一我的的記錄,其中包含名、姓和電子郵件地址。上面的示例演示如何用括號將記錄組合成一個值。固然,可使用相同的語法表示多個值(每一個值包含多個記錄):異步
{ "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" }, { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" }, { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" } ], "musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" }, { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" } ] }
這裏最值得注意的是,可以表示多個值,每一個值進而包含多個值。可是還應該注意,在不一樣的主條目(programmers、authors 和 musicians)之間,記錄中實際的名稱 / 值對能夠不同。JSON 是徹底動態的,容許在 JSON 結構的中間改變表示數據的方式。編輯器
在處理 JSON 格式的數據時,沒有須要遵照的預約義的約束。因此,在一樣的數據結構中,能夠改變表示數據的方式,甚至能夠以不一樣方式表示同一事物。 函數
格式應用
掌握了 JSON 格式以後,在 JavaScript 中使用它就很簡單了。JSON 是 JavaScript 原生格式,這意味着在 JavaScript 中處理 JSON 數據不須要任何特殊的 API 或工具包。
將 JSON 數據賦值給變量
例如,能夠建立一個新的 JavaScript 變量,而後將 JSON 格式的數據字符串直接賦值給它:
var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" }, { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" }, { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" } ], "musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" }, { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" } ] }
這很是簡單;如今 people包含前面看到的 JSON 格式的數據。可是,這還不夠,由於訪問數據的方式彷佛還不明顯。
訪問數據
儘管看起來不明顯,可是上面的長字符串實際上只是一個數組;將這個數組放進 JavaScript 變量以後,就能夠很輕鬆地訪問它。實際上,只需用點號表示法來表示數組元素。因此,要想訪問 programmers 列表的第一個條目的姓氏,只需在 JavaScript 中使用下面這樣的代碼:
people.programmers[0].lastName;
注意,數組索引是從零開始的。因此,這行代碼首先訪問 people變量中的數據;而後移動到稱爲 programmers的條目,再移動到第一個記錄([0]);最後,訪問 lastName鍵的值。結果是字符串值 「McLaughlin」。
下面是使用同一變量的幾個示例。
people.authors[1].genre // Value is "fantasy" people.musicians[3].lastName // Undefined. This refers to the fourth entry, and there isn't one people.programmers[2].firstName // Value is "Elliotte"
利用這樣的語法,能夠處理任何 JSON 格式的數據,而不須要使用任何額外的 JavaScript 工具包或 API。
修改 JSON 數據
正如能夠用點號和括號訪問數據,也能夠按照一樣的方式輕鬆地修改數據:
people.musicians[1].lastName = "Rachmaninov";
在將字符串轉換爲 JavaScript 對象以後,就能夠像這樣修改變量中的數據。
轉換回字符串
固然,若是不能輕鬆地將對象轉換回本文提到的文本格式,那麼全部數據修改都沒有太大的價值。在 JavaScript 中這種轉換也很簡單:
String newJSONtext = people.toJSONString();
這樣就好了!如今就得到了一個能夠在任何地方使用的文本字符串,例如,能夠將它用做 Ajax 應用程序中的請求字符串。
更重要的是,能夠將任何JavaScript 對象轉換爲 JSON 文本。並不是只能處理原來用 JSON 字符串賦值的變量。爲了對名爲 myObject的對象進行轉換,只需執行相同形式的命令:
String myObjectInJSON = myObject.toJSONString();
這就是 JSON 與本系列討論的其餘數據格式之間最大的差別。若是使用 JSON,只需調用一個簡單的函數,就能夠得到通過格式化的數據,能夠直接使用了。對於其餘數據格式,須要在原始數據和格式化數據之間進行轉換。即便使用 Document Object Model 這樣的 API(提供了將本身的數據結構轉換爲文本的函數),也須要學習這個 API 並使用 API 的對象,而不是使用原生的 JavaScript 對象和語法。
最終結論是,若是要處理大量 JavaScript 對象,那麼 JSON 幾乎確定是一個好選擇,這樣就能夠輕鬆地將數據轉換爲能夠在請求中發送給服務器端程序的格式。
概念比較
JSON和XML的比較
◆可讀性
JSON和XML的可讀性可謂不相上下,一邊是簡易的語法,一邊是規範的標籤形式,很難分出勝負。
◆可擴展性
XML天生有很好的擴展性,JSON固然也有,沒有什麼是XML能擴展,而JSON卻不能。不過JSON在Javascript主場做戰,能夠存儲Javascript複合對象,有着xml不可比擬的優點。
◆編碼難度
XML有豐富的編碼工具,好比Dom4j、JDom等,JSON也有提供的工具。無工具的狀況下,相信熟練的開發人員同樣能很快的寫出想要的xml文檔和JSON字符串,不過,xml文檔要多不少結構上的字符。
◆解碼難度
XML的解析方式有兩種:
一是經過文檔模型解析,也就是經過父標籤索引出一組標記。例如:xmlData.getElementsByTagName("tagName"),可是這樣是要在預先知道文檔結構的狀況下使用,沒法進行通用的封裝。
另一種方法是遍歷節點(document 以及 childNodes)。這個能夠經過遞歸來實現,不過解析出來的數據仍舊是形式各異,每每也不能知足預先的要求。
凡是這樣可擴展的結構數據解析起來必定都很困難。
JSON也一樣如此。若是預先知道JSON結構的狀況下,使用JSON進行數據傳遞簡直是太美妙了,能夠寫出很實用美觀可讀性強的代碼。若是你是純粹的前臺開發人員,必定會很是喜歡JSON。可是若是你是一個應用開發人員,就不是那麼喜歡了,畢竟xml纔是真正的結構化標記語言,用於進行數據傳遞。
而若是不知道JSON的結構而去解析JSON的話,那簡直是噩夢。費時費力不說,代碼也會變得冗餘拖沓,獲得的結果也不盡人意。可是這樣也不影響衆多前臺開發人員選擇JSON。由於json.js中的toJSONString()就能夠看到JSON的字符串結構。固然不是使用這個字符串,這樣仍舊是噩夢。經常使用JSON的人看到這個字符串以後,就對JSON的結構很明瞭了,就更容易的操做JSON。
以上是在Javascript中僅對於數據傳遞的xml與JSON的解析。在Javascript地盤內,JSON畢竟是主場做戰,其優點固然要遠遠優越於xml。若是JSON中存儲Javascript複合對象,並且不知道其結構的話,我相信不少程序員也同樣是哭着解析JSON的。
◆實例比較
XML和JSON都使用結構化方法來標記數據,下面來作一個簡單的比較。
用XML表示中國部分省市數據以下:
<?xml version="1.0" encoding="utf-8"?> <country> <name>中國</name> <province> <name>黑龍江</name> <cities> <city>哈爾濱</city> <city>大慶</city> </cities> </province> <province> <name>廣東</name> <cities> <city>廣州</city> <city>深圳</city> <city>珠海</city> </cities> </province> </country>
用JSON表示以下:
{ {name:"中國", province:[ { name:"黑龍江", cities:{ city:["哈爾濱","大慶"] }, {name:"廣東", cities:{ city:["廣州","深圳","珠海"] } }
編碼的可讀性,xml有明顯的優點,畢竟人類的語言更貼近這樣的說明結構。json讀起來更像一個數據塊,讀起來就比較費解了。不過,咱們讀起來費解的語言,偏偏是適合機器閱讀,因此經過json的索引.province[0].name就可以讀取「黑龍江」這個值。
編碼的手寫難度來講,xml仍是舒服一些,好讀固然就好寫。不過寫出來的字符JSON就明顯少不少。去掉空白製表以及換行的話,JSON就是密密麻麻的有用數據,而xml卻包含不少重複的標記字符。
JSON在線校驗工具
前言
JSON格式取代了xml給網絡傳輸帶來了很大的便利,可是卻沒有了xml的一目瞭然,尤爲是json數據很長的時候,咱們會陷入繁瑣複雜的數據節點查找中。
可是國人的一款在線工具 BeJson 給衆多程序員帶來了一陣涼風。
功能簡介
不少人在獲得JSON數據後,一時沒有辦法判斷JSON數據格式是否正確,是否少或多符號而致使程序不能解析,這個功能正好能幫助你們來完成JSON格式的校驗。
想必不少程序員都會遇到當找一個節點的時候,會發現若是直接對着一行行數據無從下手,就算知道哪一個位置,還要一個節點一個節點的往下找,萬一一不留神又得從頭開始找的麻煩事。
有了這個功能,一切JSON數據都會變成視圖格式,一目瞭然,什麼對象下有多少數組,一個數組下有多少對象。
這個功能很是實用。不光有視圖功能還有格式化、壓縮、轉義、校驗功能。總之很強大。
程序員在寫JSON語句測試用例的時候,不少時候爲了方便直接寫了個JSON字符串作測試,可是又陷入了無止境的雙引號轉義的麻煩中。這款功能集壓縮、轉義於一身,讓你在寫測試用例的時候,如魚得水。
若是你如今的電腦剛巧沒有裝你所熟悉的編輯器,若是你想針對拿到的JSON數據的某個節點作數據修改時,這個功能能夠知足你的需求。
你們都知道,JSON用的最多的仍是web項目的開發,那你要測試一個接口是否能準確的接受JSON數據,那你就得寫一個頁面發送JSON字符串,重複的作着這件事。隨着這個功能的橫空出世,你能夠擺脫寫測試頁面了,由於這個功能能夠將指定的JSON數據發送指定的url,方便吧。
不少人在寫文檔時,總但願文檔能一目瞭然,可是面對着白底黑字的JSON數據老是提不起精神不要緊,使用這個功能,全部的關鍵字都會被着色,數據結構一目瞭然。
顧名思義,將JSON格式的數據轉化成XML格式、或者XML格式的數據轉化成JSON格式,一切都不是問題。