1. 程式人生 > >Json是什麼?以及Json的序列化和反序列化

Json是什麼?以及Json的序列化和反序列化

一什麼是JSON?

  中午肚子餓了,到餐廳點餐。向服務員點了幾個菜,廚師根據使用者的需求,開始烹飪食物,食物烹飪好後,怎麼將食物呈現給使用者呢?這時就需要用到盛放食物的碗了使用者拿到盛放食物的碗,就可以獲得點的餐了這個碗就充當了資料交換的容器了。(^ - ^)

  客戶端向伺服器端傳送請求後,伺服器端怎麼才能把使用者需要的資料返回給客戶端呢。這時我們就需要用一個指定的格式將資料,按照指定格式返回客戶端。這時就有了兩種資料傳輸的方式(XMLJson):

  在普通的網路應用中,不管是伺服器端還是客戶端解析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物件要求給屬性加雙引號,忘了給物件屬性名加雙引號而寫成單引號都是常見的錯誤”。