Json是什麼?以及Json的序列化和反序列化
一什麼是JSON?
中午肚子餓了,到餐廳點餐。向服務員點了幾個菜,廚師根據使用者的需求,開始烹飪食物,食物烹飪好後,怎麼將食物呈現給使用者呢?這時就需要用到盛放食物的碗了使用者拿到盛放食物的碗,就可以獲得點的餐了這個碗就充當了資料交換的容器了。(^ - ^)
客戶端向伺服器端傳送請求後,伺服器端怎麼才能把使用者需要的資料返回給客戶端呢。這時我們就需要用一個指定的格式將資料,按照指定格式返回客戶端。這時就有了兩種資料傳輸的方式(XML和Json):
在普通的網路應用中,不管是伺服器端還是客戶端解析XML程式碼會非常麻煩,所以這時的Json的就更加滿足資料傳輸解析的要求。採用的的Json格式的方式進行資料的傳輸,不僅方便傳輸解析,還特別易於人閱讀和編寫
二.XML與Json的的轉換:
1.常規轉換:
<emp>
<name>fxhl</name>
<city>深圳</city>
<age>23</age>
</emp>
轉換為的Json的為:
{“名”:“fxhl”,“城市”:“深圳”,“年齡”:23}
三以以.json的表現形式:
1.物件:
{ "returnCode": "R0000", "returnMsg": "成功", "lessTimes": "2", "domainLink": "", "seqNum": "1", "identification": "595279", "isNeedImageCode": "false" }
2.陣列:
{
"employees": [
{ "firstName":"John" , "lastName":"Doe" },
{ "firstName":"Anna" , "lastName":"Smith" },
{ "firstName":"Peter" , "lastName":"Jones" }
]
}
3.陣列物件混合:
這是擷取的一小部分,對於比較複雜的的的Json格式的字串,可以線上驗證JSON。格式化一個格式。方便觀看
-
-
- JSON的表現形式一般就三種(物件,陣列,字串),使用過程中,只是將物件與陣列進行混合了
- JSON的表現形式一般就三種(物件,陣列,字串),使用過程中,只是將物件與陣列進行混合了
-
{
"icon": [
{
"title": "尚天貓,就購了",
"icon_category": "baobei",
"icon_key": "icon-service-tianmao",
"trace": "srpservice",
"innerText": "天貓寶貝",
"url": "//www.tmall.com/"
},
{
"title": "保險理賠",
"position": "99",
"innerText": "分組-保險理賠",
"iconPopupComplex":
{
"popup_title": "保險理賠",
"subIcons": [
{
"dom_class": "icon-service-yunfeixian",
"icon_content": "賣家贈送退貨運費險"
}
]
}
}
]
}
4. 以以.json序列化和解析
JSON.stringify() - 將物件序列化為JSON字串
JSON.parse() - 將JSON資料解析為Javascript物件
預設情況下JSON.stringify()輸出的JSON字串不包含任何空格字元或縮排;此外,值為未定義的任何屬性也都會被跳過,結果都是有效的JSON資料型別。
實際上,JSON.stringify()除了要序列化的javascript物件之外,還可以接收兩個引數(用於指定以不同方式序列化的JavaScript):1第一個引數是過濾器(可為陣列或函式))2。第二個引數是一個選項(表示是否在JSON字串中保留縮排)
4.1 過濾結果
- 如果過濾器的引數是陣列,那麼JSON.stringify()的結果將只包含陣列中列出的屬性。
注意:第二個陣列中的兩個欄位要與JSON中的屬性對應。
輸出結果:(jsonText的值)
- ü如果第二個引數是函式(傳入的函式接收兩個屬性,屬性(鍵)名和屬性值):
輸出結果:(jsonText的值)
可以看到如果鍵為”編輯”,通過返回未定義刪除該屬性。一定要提供預設項,使其他值可以顯示在結果中
4.12 字串的縮排
JSON.stringify()方法的第三個引數用於控制結果的縮排和空白符。如果這個引數是一個樹枝那麼他表示的是每個級別的縮排空格。
例:要每個級別縮排4個空格
var jsonText = JSON.stringify(book,null,4)
注:最大縮排空格為10,所有大於10的值都會被自動轉換為10。
4.13 tojson()方法
有時候JSON.stringify()不能滿足自動序列化的需求。這時就可以給物件定義的toJSON()方法。
結果輸出:
的toJSON()方法可以作為函式過濾器的補充假設把一個物件傳入JSON.stringify(),序列化該物件的順序:
(1)如果存在的toJSON()方法且能通過它取得有效的值,則呼叫該方法,否則返回JSON本身。
(2)如果提供了第二個引數,應用這個過濾器,傳入過濾器的值是第(1)步返回的值(其實結果就是,上述的jsonText輸出結果是的的toJSON()方法返回的值)
(3)如果提供了第三個引數,執行相應的格式化操作。
4.2解析結果
JSON.parse()來來方法也可以接收另一個引數,該引數是個函式,將在每個鍵值對上呼叫。為了區別去JSON.stringify(),這個函式被稱作還原函式
如果還原函式返回未定義則刪除該鍵,如果返回其他值,則將鍵插入到結果中去。
例:在日期字串轉化為日期物件時,經常用到還原函式
輸出結果:
小結:“JSON物件要求給屬性加雙引號,忘了給物件屬性名加雙引號而寫成單引號都是常見的錯誤”。