https://blog.csdn.net/pupilxiaoming/article/details/80988013
一什么是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的表現形式一般就三種(對象,數組,字符串),使用過程中,只是將對象與數組進行混合了
-
-
{
-
"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對象要求給屬性加雙引號,忘了給對象屬性名加雙引號而寫成單引號都是常見的錯誤”。


