什么是json?如何理解json這種數據格式?
百度百科解釋:
JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式。它基於 ECMAScript (歐洲計算機協會制定的js規范)的一個子集,采用完全獨立於編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網絡傳輸效率。
1、json是什么 ,json字符串
從百科解釋,我們可以得出簡化的定義:json是一種數據格式,json是一種格式,而不是一種數據。
我在初學javascript的時候,接觸到json的時候一直覺得很繞,因為總是聽到有人說傳遞“json數據,json數據”,如果是數據的話就一定有數據類型,就下意識認定json是一種javascript的數據類型,但js中找不到這種數據的類型。
后來,大致總結了三種說法,
1、傳遞“ json數據,json數據”,
2、傳遞“ json格式的數據 ”,
3、傳遞“ json格式的 字符串”,
我認為剛開始理解的時候,用第三種說法解釋起來更好理解一些,
我們平常在js中說的json數據,實際上在發送和接收的時候都只是一個字符串而已,只不過這個字符串的樣子帶有一定規則,它遵循json這種格式。
要想不那么繞,只要記住 json數據 = json字符串
json數據(json字符串)究竟長什么樣,讓我們來舉個栗子:
1、第一種是類似於 對象數組 格式的字符串(每個元素是對象,可以稱為json數組):
String json_arr_str = '[{"a":123},{"b":123}]', //里面的雙引號是必須的,用\轉義
2、第二種是類似於 對象 的字符串(每個元素是鍵值對,可以稱為json對象):
String json_obj_str = '{"a":123,"b":"xzt"}',//里面的雙引號是必須的,用\轉義
3、第三種是基於前兩種格式互相嵌套的字符串,只要每一層的數據都符合上面的兩種的各一種,理論上嵌套多少層都沒問題
json是什么,以及json數據我們也見過了。那么
2、如何對json數據進行操作呢?
一般前后端傳遞都是直接傳的字符串,開始我們獲取數據只是一個字符串而已,而字符串若包含的很多信息,不是收到就能直接用的,如何將字符串中包含的的數據有規律提取出來也是個問題。
每個編程語言都有自己的語法,但字符串類的數據都是編程語言必有的,所以json格式數據的適用范圍很廣。我們現在用的編程語言幾乎是面向對象的,以對象為數據的載體,操作數據都圍繞着對象來展開,而不是直接操作字符串。
試想一下,數據的傳遞都是很頻繁的,若需要自己寫方法反復操作字符串豈不是很不方便?若是沒有規定傳遞數據的格式,總不能每次接收到字符串數據,都自己去做切片操作把數據切出來吧。萬一這次傳的數據格式與上次不一樣,那么我上一次寫的解析代碼不能用,還得針對數據再寫一次方法。
恰好,我們定義的json格式的字符串數據,格式就是固定的,很好的解決了困擾之一。因為json數據格式,實際上只有上面說的兩種情況,用編程語言實現了對json字符串的這些操作其實不難,而且都是可以重復使用的。
小結一下:數據傳遞是以字符串的方式來傳遞的,若是要方便的獲取里面的信息,就得約定好字符串數據的格式,不然每次傳出遞數據沒啥,但解析數據就得亂套。以json這種格式傳遞的數據,就是這樣一個帶有約定規則的字符串,對接收者來說解析其中數據很方便。
現在一些編程語言已經內置了方法實現了,可以將 json字符串,語言對象 二者相互轉化。例如javascript,php語言等。(具體方法不舉例,搜索就有)
再試想一下,若是有個內置方法可以讓你解析json數據成該編程語言的對象,那么你就可以用這種語言訪問對象的方式,很方便的去訪問對象里面的各種屬性。就省去了很多麻煩。
而有些編程語言即使沒有內置的json字符串,語言對象 二者互相轉化的方法。但網上已經有開發者寫好的現成的方法可以使用。
例如java就有一些工具包。其中之一例如阿里巴巴自己開發的fastjson這個jar包,引用里面的方法,可以很方便的對
json字符串,json數組, json對象, javaBean對象四者的相互轉化。
上面提到的就只有json字符串,和語言對象這兩種數據的轉化,但這里為什么多了json數組和json對象這兩個名詞呢,其實json數組,json對象他們本質上就是json字符串,因為他們符合上面我寫的三點json語法的前兩點。
為什么還要多余的分出來呢?很難說具體的原因,也許是開發者為了給我們更多的選擇,我在使用的時候就感覺到,將json字符串轉化成java對象的時候,還得自己寫個跟json字符串的數據相匹配格式的類對象,然后再用對象訪問某個屬性,就很麻煩。但是json字符串直接轉化成json數組,或json對象之后,里面還有配套的方法可以直接轉化成json數組,json對象的方法。這樣是不是更方便些?
再說說json對象與對象的區別吧,二者都有對象二字,是不是感覺自己都快分不清了
舉個栗子對比一下:
json對象: String json_obj_str = '{"a":123,"b","321"}'
js對象: let js_obj = {a:123,b:"321"}
可以看到,二者是很有區別的。
json對象首先是字符串,它遵循字符串的操作規則,並且里面的key是有雙引號的。
而js對象首先它是js語言的對象,它則遵循的js本身語言的操作規則。
同理json數組與編程語言中的數組也是一樣的。
再說一下為什么百度百科說json是一種“輕量級”數據格式,做個對比吧,比如xml數據,同為文本格式的內容,xml數據每個數據都有標簽套在外面,而json數據只需要外面加個 []或者{},里面的數據用,隔開,鍵和值中間只要一個:隔開就行。要是數據龐大的話,無論怎么說,幾個簡單的符號都比一堆標簽更簡單,占內存更小。
總結:說到底,json是一種數據格式,json數據就是一個字符串,而 json數組 , json對象 就是滿足上面說的1,2兩點的格式而存在的json字符串而已,本質上就是json字符串。json字符串只有json數組,json對象,或者二者互相嵌套的這三種形式。鑒於合法的json字符串數據的形式不同,編程語言語法不同,開發解析方法的人需求不同。每個編程語言實現對json的操作的方法也略有不同。但理解了json是個什么東西,本質上其實還是一樣的,無非都是為了方便自己提取傳過來的數據。甚至我們自己也能寫對應的json相關方法(我不能,見笑見笑了)。**
下面再附上一條有關java ,fastjson包下載,以及使用的博客鏈接:
https://blog.csdn.net/srj1095530512/article/details/82529759