JSON的淺談和基本介紹
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格局。它基於ECMAScript的一個子集。 JSON選用完全獨立於言語的文字格局,但是也使用了類似於C言語宗族的習氣(包含C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使json除錯成為抱負的資料交換言語。 易於人閱覽和編寫,同時也易於機器解析和生成(一般用於提高網路傳輸速率)。
二: 在學習JavaScript的過程中,我們接觸了一種新的資料格式——JSON資料格式。JSON的全稱是”JavaScript Object Notation”,意思是
JSON的格式
JSON 資料的書寫格式是鍵(名稱)/值對。
JSON 鍵值對是用來儲存 JS 物件的一種方式,和 JS 物件的寫法也大同小異,鍵/值對包括欄位名稱(在雙引號中),後面寫一個冒號,然後是值。
JSON 值可以是:字串(在雙引號中)、陣列(在中括號中)、數字(整數或浮點數)、邏輯值(true 或 false)、物件(在大括號中)、 null。
JSON結構
JSON結構有兩種結構,就是物件和陣列。通過這兩種結構可以表示各種複雜的結構。
{"province": "Shanxi"}
可以理解為是一個包含province為Shanxi的物件, ["Shanxi","Shandong"]
這是一個包含兩個元素的陣列 而
[{"province": "Shanxi"},{"province": "Shandong"}]
就表示包含兩個物件的陣列。 當然了,你也可以使用 {"province":["Shanxi","Shandong"]}
來簡化上面的JSON,這是一個擁有一個name陣列的物件。
下面是一小段JSON程式碼:
{“skillz”: {“web”:[ {“name”: “html”, “years”: “5” }, {“name”: “css”, “years”: “3” }],”database”:[ {“name”: “sql”, “years”: “7” }]}}
花括弧,方括弧,冒號和逗號
花括弧表示一個“容器”
方括號裝載陣列
名稱和值用冒號隔開
陣列元素通過逗號隔開
三: Json 和 xml的區
1. 在可讀性方面,JSON和XML的資料可讀性基本相同。JSON和XML的可讀性可謂不相上下,一邊是建議的語法,一邊是規範的標籤形式,很難分出勝負。
2. 在可擴充套件性方面,XML天生有很好的擴充套件性,JSON當然也有,沒有什麼是XML能擴充套件,JSON不能的。
3. 在編碼難度方面,XML有豐富的編碼工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的編碼明顯比XML容易許多,即使不借助工具也能寫出JSON的程式碼,可是要寫好XML就不太容易了。
4. 在解碼難度方面,XML的解析得考慮子節點父節點,讓人頭昏眼花,而JSON的解析難度幾乎為0。這一點XML輸的真是沒話說。
5. 在流行度方面,XML已經被業界廣泛的使用,而JSON才剛剛開始,但是在Ajax這個特定的領域,未來的發展一定是XML讓位於JSON。到時Ajax應該變成Ajaj(Asynchronous Javascript and JSON)了。
6 JSON相對於XML來講,資料的體積小,Json與JavaScript的互動愈加方便,Json對資料的描述性比XML較差,Json的速度要遠遠快於XML
7 從記憶體方面,json去掉了標籤,節省了大量的記憶體空間
例如 xml
<Book>
<name>name</name>
<author>
<name>authorname</name>
<age>23</age>
</author>
<year>2010</year>
</Book>
json
{"name":"name","author":{"name":"authorname","age":23},"year":2010}
四 json 和js物件的轉換關係
很多人搞不清楚 JSON 和 JS 物件的關係,甚至連誰是誰都不清楚。其實,可以這麼理解:JSON 是 JS 物件的字串表示法,它使用文字表示一個 JS 物件的資訊,本質是一個字串。平時說的JSON物件,是JSON格式的JS物件或是符合JSON資料結構要求的JS物件。
JSON和JS物件互轉
要實現從物件轉換為 JSON 字串,使用 JSON.stringify() 方法:
結果:
要實現從 JSON 轉換為物件,使用 JSON.parse() 方法:
結果:
五 :json中帶有轉義字元
比如從後臺返回這樣一段json串,中間有個欄位 reminderContent 這個String型別後面其實也是一個json串,後臺封裝資料之後就自動轉義了其中的雙引號,這個時候用Gson轉換的時候會報錯的,因為你的實體類中 reminderContent 這個欄位是String型別,但是後臺的這個資料中卻包含有轉義符號,因此無法解析成功。可以在程式碼中存在,入資料庫中必須解析
{
"userInfo": {
"headPicUrl": "585658179_temphead.jpg",
"nickName": "Mia",
"userId": 15678355887
},
"reminderContent": "{\"contentText\":\"我就說一句話\",\"contentTitle\":\"提醒\",\"settingTime\":1523254256000,\"or\":\"1\"}",
"reminderId": 152352210043891,
"reminderTime": 1523522100447,
"reminderType": 6
}
目前本人的方法是,先把從後臺獲取的整個字串過濾一把,把其中的轉義符號替換一下,比如:
String jsonStr = "後臺獲取的資料" jsonStr = jsonStr.replace("\\\"", "'");
然後再解析整個Json串;
ReminderEntity reminderEntity = gson.fromJson(jsonStr, ReminderEntity.class);