初識JSON

来源:http://www.cnblogs.com/qqandfqr/archive/2017/01/18/6296589.html
-Advertisement-
Play Games

▓▓▓▓▓▓ 大致介紹 JSON(JavaScript Object Notation JavaScript對象表示法),JSON是一種數據格式,不是一種編程語言。雖然它的名字中有JavaScript但是它卻不屬於JavaScript,就像Java和JavaScript的關係一樣。而且,並不是只有J ...


▓▓▓▓▓▓ 大致介紹

  JSON(JavaScript Object Notation  JavaScript對象表示法),JSON是一種數據格式,不是一種編程語言。雖然它的名字中有JavaScript但是它卻不屬於JavaScript,就像Java和JavaScript的關係一樣。而且,並不是只有JavaScript才使用它,畢竟 JSON 只是一種數據格式。很多編程語言都有針對 JSON 的解析器和序列化器。

  JSON是由Douglas Crockford在2001年提出,為了取代XML

 

▓▓▓▓▓▓ 語法

  JSON的語法可以包含三種類型的值:

    ◆ 簡單值

    ◆ 對象

    ◆ 數組

 

  ▓▓▓▓▓▓ 簡單值

    簡單值:使用與 JavaScript 相同的語法,可以在 JSON 中表示字元串、數值、布爾值和 null

    註意:【1】JSON 不支持 JavaScript 中的特殊值 undefined

       【2】JSON 字元串必須使用雙引號(單引號會導致語 法錯誤)

         // 有效的JSON數據
         "Hellow World!"
         5
         true
         null

 

  

  ▓▓▓▓▓▓ 對象

    對象作為一種複雜的數據類型,表示的是一組有序的鍵值對,每個鍵值對中的值既可以是簡單值也可以是複雜數據類型的值

    JSON中的對象和JavaScript中的字面量稍微有一些不同:

      1、沒有聲明變數

      2、在末尾不需要加分號

      3、JSON 中對象的屬性名任何時候都必須加雙引號

    註意:同一個對象中絕對不應該出現兩個同名屬性

        // JavaScript中的字面量
        var person = {
            name : "Lao Wang",
            age : 21
        };

        // JSON
        {
            "name" : "Lao Wang",
            "age" : 21
        }

        // 可以在對象中嵌入對象
        {
            "name" : "Lao Wang",
            "age" : 21,
            "school" : {
                "name" : "TJLG",
                "location" : "西青"
            }
        }

 

  

  ▓▓▓▓▓▓ 數組

    JSON 數組採用的就是 JavaScript 中的數組字面量形式

        // JavaScript
        var values = [21,"西青",true];

        // JSON
        values = [21,"西青",true]

 

▓▓▓▓▓▓ JSON對象

  早期的 JSON 解析器基本上就是使用 JavaScript 的 eval()函數。由於 JSON 是 JavaScript 語法的子 集,因此 eval()函數可以解析、解釋並返回 JavaScript 對象和數組,但是使用eval()函數對JSON數據結構求值存在風險,應為可能會執行一些惡意代碼,所以要儘量少的使用eval()函數

  ECMAScript 5 對解析 JSON 的行 為進行規範,定義了全局對象 JSON。支持這個對象的瀏覽器有 IE 8+、Firefox 3.5+、Safari 4+、Chrome 和 Opera 10.5+。對於較早版本的瀏覽器,可以使用一個 shim:https://github.com/douglascrockford/JSON-js。 

  JSON對象有兩個方法:

    1、stringify()

    2、parse()

 

    ▓▓▓▓▓▓ stringify()

    stringify()方法將JavaScript對象序列化為JSON字元串

    註意:

      【1】預設情況下,JSON.stringify()輸出的 JSON 字元串不包含任何空格字元或縮進

        var person = {
            name : "Lao Wang",
            grade : {
                "English" : "88",
                "Math" : "98"
            }
        };

        var jsonPerson = JSON.stringify(person);
        console.log(jsonPerson);
        // {"name":"Lao Wang","grade":{"English":"88","Math":"98"}}

 

      【2】 如果對象的成員是undefined或者函數,該成員會被忽略

            如果數組的成員是undefined或者函數,則這些值會被轉成null

        var person = {
            name : function(){},
            sex : undefined,
            age : 21,
            grade : [undefined,function(){},"English"],
        }

        var jsonPerson = JSON.stringify(person);
        console.log(jsonPerson);
        // {"age":21,"grade":[null,null,"English"]}

 

      【3】JSON.stringify()會忽略對象的不可遍歷屬性

        var person = {};
        Object.defineProperties(person,{
            'name' : {
                value : "Lao Wang",
                enumerable : true
            },
            'age' : {
                value : 21,
                enumerable : false
            }
        });

        var jsonPerson = JSON.stringify(person);
        console.log(jsonPerson);
        // {"name":"Lao Wang"}

 

    實際上,JSON.stringify()除了要序列化的 JavaScript 對象外,還可以接收另外兩個參數,這兩 個參數用於指定以不同的方式序列化 JavaScript 對象

      第一個參數是個過濾器,可以是一個數組,也可 以是一個函數

      第二個參數是一個選項,表示是否在 JSON 字元串中保留縮進

      

      1、當第一個參數是數組時

      如果過濾器參數是數組,那麼 JSON.stringify()的結果中將只包含數組中列出的屬性

      註意:

        【1】、過濾器只對對象的第一層屬性有效

        var person = {
            name : "Lao Wang",
            grade : {
                "English" : "88",
                "Math" : "98"
            }
        };

        var jsonPerson = JSON.stringify(person,["name","Math"]);
        console.log(jsonPerson);
        // {"name":"Lao Wang"}

 

        【2】過濾器對數組無效

        var values = [21,"he",true,"we"];

        var jsonValues = JSON.stringify(values,["he"]);
        console.log(jsonValues);
        // [21,"he",true,"we"]

 

      2、當第一個參數是函數時

        傳入的函數接收兩個參數,屬性(鍵)名和屬性值。根據屬性(鍵)名可以知道應該如何處理要序列化的對象中的屬性。屬性名只能是字元串,而在值並非鍵值對兒結構的值時,鍵名可以是空字元串。 為了改變序列化對象的結果,函數返回的值就是相應鍵的值。

        註意:如果函數返回了undefined或沒有返回值,那麼相應的屬性會被忽略

        var values = {
            name : "Lao Wang",
            age : 21,
            sex : "男"
        }

        var jsonValues = JSON.stringify(values,function(key,value){
            if(key == "sex"){
                return undefined;
            }else{
                return value;
            }
        });
        console.log(jsonValues);
        // {"name":"Lao Wang","age":21}

 

      3、當給定第三個參數時

        JSON.stringify()方法的第三個參數用於控制結果中的縮進和空白符。如果這個參數是一個數值,那它表示的是每個級別縮進的空格數

        註意:

          【1】只要傳入有效的控制縮進的參數值,結果字元串就會包含換行符

          【2】最大縮進空格數為10,所有大於10的值都會自動轉換為10

          【3】如果縮進參數是一個字元串而非數值,則這個字元串將在 JSON 字元串中被用作縮進字元(不再使用空格)

        // 參數是數值
        var person = {
            name : "Lao Wang",
            grade : {
                "English" : "88",
                "Math" : "98"
            }
        };

        var jsonPerson = JSON.stringify(person,null,4);
        console.log(jsonPerson);
    /*
        {
            "name": "Lao Wang",
            "grade": {
                "English": "88",
                "Math": "98"
            }
        }

    */

        // 參數是字元串
        var person = {
            name : "Lao Wang",
            grade : {
                "English" : "88",
                "Math" : "98"
            }
        };

        var jsonPerson = JSON.stringify(person,null,"-_-||");
        console.log(jsonPerson);
    /*    
        {
        -_-||"name": "Lao Wang",
        -_-||"grade": {
        -_-||-_-||"English": "88",
        -_-||-_-||"Math": "98"
        -_-||}
        }
    */

 

    ▓▓▓▓▓▓ toJSON()

    有時候,JSON.stringify()還是不能滿足對某些對象進行自定義序列化的需求。在這些情況下, 可以通過對象上調用toJSON()方法,返回其自身的JSON數據格式

        var person = {
            name : "Lao Wang",
            grade : {
                "English" : "88",
                "Math" : "98"
            },
            toJSON : function(){
                return "toJSON方法";
            }
        };

        var jsonPerson = JSON.stringify(person);
        console.log(jsonPerson);
        // "toJSON方法"

    

    註意:如果toJSON()方法返回undefined,此時如果包含它的對象嵌入在另一個對象中,會導致該對象的值變成null。而如果包含它的對象是頂級對象,結果就是undefined

        // 嵌入在另一個對象中
        var person = {
            name : "Lao Wang",
            grade : {
                "English" : "88",
                "Math" : "98"
            },
            sex : {
                value : "男",
                toJSON : function(){
                    return undefined;
                }
            }

        };

        var jsonPerson = JSON.stringify(person,null,4);
        console.log(jsonPerson);
    /*
        {
            "name": "Lao Wang",
            "grade": {
                "English": "88",
                "Math": "98"
            }
        }
    */

        // 嵌入頂級對象
        var person = {
            name : "Lao Wang",
            grade : {
                "English" : "88",
                "Math" : "98"
            },
            toJSON : function(){
                return undefined;
            }
        };

        var jsonPerson = JSON.stringify(person,null,4);
        console.log(jsonPerson);
        // undefined

 

    原生Date對象有一個toJSON()方法,能夠將JavaScript的Date 對象自動轉換成ISO 8601日期字元串(與在Date對象上調用toISOString() 的結果完全一樣)

        var date = JSON.stringify(new Date("2017-1-18"));
        console.log(date);
        // "2017-01-17T16:00:00.000Z"

 

    

    toJSON()可以作為函數過濾器的補充,因此理解序列化的內部順序十分重要。假設把一個對象傳入JSON.stringify(),序列化該對象的順序如下

      1、如果存在toJSON()方法而且能通過它取得有效的值,則調用該方法。否則,按預設順序執行序列化

      2、如果提供了第二個參數,應用這個函數過濾器。傳入函數過濾器的值是第一步返回的值

      3、對第二步返回的每個值進行相應的序列化

      4、如果提供了第三個參數,執行相應的格式化

 

    ▓▓▓▓▓▓ JSON.parse()     

      JSON.parse()將JSON字元串解析為JavaScript值

        var person = JSON.parse('{"name":"Lao Wang"}');
        console.log(person.name);
        // Lao Wang

 

      註意:如果傳入的字元串不是有效的JSON格式,JSON.parse方法將報錯

 

      JSON.parse()方法也可以接收另一個參數,該參數是一個函數,將在每個鍵值對兒上調用。為了區別 JSON.stringify()接收的替換(過濾)函數(replacer),這個函數被稱為還原函數(reviver),還原函數接收兩個參數,一個鍵和一個值,而且需要返回一個值 

      註意:如果還原函數返回 undefined,則表示要從結果中刪除相應的鍵;如果返回其他值,則將該值插入到結果中

        var person = JSON.parse('{"name":"Lao Wang","age":21}',function(key,value){
            if(key == "age"){
                return undefined;
            }else{
                return value;
            }
        });
        console.log(person.name);
        // Lao Wang

 

      在將日期字元串轉換為 Date 對象時,經常要用到還原函數

        var book = {
             "title": "Professional JavaScript",
             "authors": ["Nicholas C. Zakas"],
             edition: 3,
             year: 2011,
             releaseDate: new Date(2017, 1, 18)
         };

        var jsonText = JSON.stringify(book,null,4);
        console.log(jsonText);
    /*
        {
            "title": "Professional JavaScript",
            "authors": [
                "Nicholas C. Zakas"
            ],
            "edition": 3,
            "year": 2011,
            "releaseDate": "2017-02-17T16:00:00.000Z"
        }
    */

        var bookCopy = JSON.parse(jsonText, function(key, value){
             if (key == "releaseDate"){
                 return new Date(value);
             }else{
                 return value;
             }

        });

        console.log(bookCopy.releaseDate.getFullYear()); 
        // 2017

 

  參考資料:

      小火柴的藍色理想-深入理解JSON對象

      JavaScript高級程式設計中文版第三版

         

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用 :hover 和 :focus 這樣的偽類,我們可以很方便的將元素從一個樣式切換到另一個樣式,而且切換是會有過渡效果。但有時我們想要使用 js 來驅動過渡(即在代碼中觸發過渡)也是可以實現的。 和普通過渡一樣,先創建兩個樣式規則,一個是元素的初始狀態,一個是過渡結束的狀態。然後用 js 在合適 ...
  • HTML DOM 樹形結構: HTML DOM 實例 學習 100 個實例!使用我們的編輯器,你可以編輯 HTML 文檔,然後單擊 "嘗試一下" 按鈕來查看結果。 源代碼: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <b ...
  • 一、function預設參數 二、rest參數 三、擴展運算符 四、箭頭函數 具有詞法作用域的 this this問題 第二種方法是用bind(this),即 但現在我們有了箭頭函數,就不需要這麼麻煩了: ...
  • 1.board.wxml 2.board.js 3.board.wxss ...
  • 終於到了最後了,這裡要告一段落了,整了個js運動框架,咳咳咳,好冷 啊啊啊啊啊啊,這天氣。媽的,工資怎麼也不發,啊,說好的 人與人之間的信任呢?哎,氣誒,不到150字啊,又是這個梗。。怎麼辦?說些什麼呢?哦,就是今天在嘗試做那個,曲面陰影和翹邊 陰影的時候,碰到一個問題,就是a:after這個層,想 ...
  • 引用: <script src="http://static.tctip.com/js/tctip.min.js"></script> <link type="text/css" rel="stylesheet" href="http://static.tctip.com/css/myRewards ...
  • 背景 截圖或頁面複製圖片,可以直接通過Ctrl+v 粘貼上傳圖片 原理 操作:複製(截圖)=>粘貼=>上傳 監聽粘貼事件=>獲取剪貼板里的內容=>發請求上傳 瀏覽器:Chrome、IE11 Chrome瀏覽器 1、通過監聽粘貼事件,event有clipboardData屬性,且clipboardDa ...
  • 一、發現黑科技的起因 今天在微信公眾號看到一篇技術博文,想用印象筆記收藏,所以發送了文章鏈接到pc上。然後習慣性地打開控制台,看看源碼,想瞭解下最近微信用了什麼新技術。 呵呵,以下勾起了我偵探的欲望。頁面載入後的異常點就是只載入了一個js,如下圖所示: 我很詫異,為什麼已經開啟了Disable ca ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...