談談JSON那些事

已經有九天沒有發表文章更新了,嚴重違反了自己定好的“每周至少發表一篇文章”的計劃。因為是在太忙了,朝九晚九的,有時下班回家就直接睡覺(感覺給自己找了些許借口==||)。好了,廢話不多說了,來看正文。

1. 什么是JSON?

什么是JSON?記得剛開始接觸JSON這一概念的時候是在大三的時候,由于需要將數據從WEB服務器后臺傳遞到頁面中,比如,需要將一個名為name的屬性值傳遞到頁面,當然,這很平常、很簡單??墒?,如果我要傳遞很多數據,很多有組織性的數據,比如是一個實體類的數據,或者說是數據庫中的一條記錄,那要如何傳遞到前端頁面呢?其實,在絕大所數的異步請求下,都會使用JSON這種數據格式來實現,對于一些比較單一的數據則可以采用框架自帶的功能或者使用像EL/ONGL等類似的標記性語言。當然,這里還是強調一下JSON這種數據格式。

JSON(Javascript Object Notation)是一種輕量級的數據格式,完全獨立于語言的文本格式,也就是說整個JSON文檔就是一個文本文檔,所以JSON是一種理想的數據交換格式。在非關系型數據庫中,也能見到JSON的身影,比如在MongoDB中,也采用了一種類似JSON的數據格式,不過它叫BSON。JSON在Javascript中處理是不需要額外的API或者工具包的,所以效率非常高。

2. JSON數據格式

  1. 記住,JSON不是一種語言,只是一種數據格式。這種格式在存儲的時候最多算是一個字符串數據而已。
  2. 下面簡要介紹一下JSON的數據格式規范
demo1 = {}                          //空數據
demo2 = {"key":"value"}             //JSON是一種鍵值對的集合格式,每個鍵對應一個值
demo3 = {"key":[1,2,3]}             //JSON中可以存儲數組元素
demo4 = {                           //JSON中可以存儲無限個鍵值對數據 
            "key1":"value1",
            "key2","value2"
         }
demo5 = {                           //理論上,JSON可以進行無限次的嵌套
           "key1":"value1",
           "key2":{
                     "key3":"value3",
                     "key4":"value4"
                  }
         }
3. JSON在Javascript中的解析方法

在Javascript中,主要采用以下兩個方法來解析JSON數據:

eval() 和 JSON.parse()

基本的使用方式如下:

var jsonstr = '{"name":"jifeng","company":"taobao"}';

//eval function
var evalJson = eval('(' + jsonstr + ')');

//json.parse function
var jsonParseJson = JSON.parse(evalJson);

4. JSON.parse() 和 eval()的區別

在代碼中使用eval()是非常危險的,因為eval()在解析字符串時,會執行該字符串中的代碼,特別是用它執行第三方JSON字符串時,可能包含有惡意代碼。而JSON.parse()方法解析字符串本身。使用JSON.parse()可以捕捉JSON中的語法錯誤。

var jsonStr = {"key":"demo","key2":"demo"};

var jsonObj1 = JSON.parse(jsonStr);            //使用JSON.parse()解析JSON,不會執行jsonStr中的代碼
var jsonObj2 = eval('('+jsonStr+')');          //會執行jsonStr中的代碼,非常不安全

var errJson = {'error json format example'}    //這是一段錯誤的JSON格式的數據

var jsonObj3 = JSON.parse(errJson);            //控制臺下會報錯并顯示堆棧信息
var jsonObj4 = eval('('+errJson+')');          //控制臺下不會報錯,jsonObj4 = undefined
5. 談談Javascript在解析JSON時存在的坑

1 轉義字符:數據本身存在需要使用轉義字符才能表示的字符

在Javascript中,有一個轉義字符就是\\,可以說對于沒有深入接觸過JSON的新手來說,很大概率上會踩這個坑。比如你的JSON數據是這個樣子的:

{"key1":"\"demo\""}

就這個格式的數據,在服務端程序中表示的時候是沒有問題的,數據本身就帶有雙引號,所以這里使用到了轉義字符\\,但是在Javascript中就不行了,Javascript是不允許出現任何轉義字符的。那如果真的要存儲需要轉義字符才能實現的數據時,比如數據本身就帶有雙引號,那么這個時候真么解決呢?我想一個比較土的方法就是先替換掉JSON字符串中的所有需要使用轉義字符表示的字符,然后再進行解析,解析完成后再將原來的字符替換回去。

var demo = "{"key":"value\""}";        //帶有雙引號的JSON數據
var dealDemo = demo.replace('\\','-');      //將數據中的'\'轉化為'-'
var jsonDemo = JSON.parse(dealDemo);        //解析JSON數據
var data = jsonDemo.key.replace('-','\\'); //將雙引號替換回去

當然,這種辦法也不是有弊端的,那就是你的json數據本身不能出現-這個字符。

2 數字&字符串

這個問題我也是最近才發現的(筆者也是踩坑過來的=.=)。先來看個簡單的例子:

//假設某類型的數據有不同的值,可以單個值,也可以多個值,多個值是使用逗號隔開
var json1 = {"key":"tag","key1":1} ;
var json2 = {"key":"tag","key1
![257251_1455763624_2481.png](http://upload-images.jianshu.io/upload_images/1784374-bfb508453e93788b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
":"1,2"}

//遍歷JSON數據集合,同時解析其value值,將其分開
var demo = JSON.parse(json1);
var value = demo.tag;
var values = value.split(',');

//對于json2,是正常的,得到的values = [1,2]
//對于json1,則報錯了,原因是Javascript把'1'看成數字了,數字沒有split這個方法

//解決方式:
//將value強制轉化為字符串
var str = new String(value);            //這樣對于json1的數據就不會報錯了

所以,對于JSON,我覺得格式統一很重要,并且為其value全部加上引號,這樣規范后,可以讓前端少踩一些不必要的坑。

{"鍵名稱有引號":"鍵值也有引號"}
{"key":"value"}
{"tag":"1"}

//不推薦這種:
{"tag":1}

文章更新日志:

2016-07-17 19:01 《談談JSON那些事》初稿
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,868評論 18 139
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,268評論 0 4
  • 在這次的分身術的學習中,我的觀念不斷的被刷新,主動性也有了很大提高。其實我也有過猶豫的彷徨,但是最后我終于分身出來...
    亞里士多缺德閱讀 392評論 0 0
  • 演講者在描述一件事情時,簡單一點就是表達結果,但是不足以讓聽者記憶深刻。 就像我們在店面做銷售一樣,通常做銷售經歷...
    城市格調劉姣閱讀 147評論 0 0
  • 1、選擇權 擁有更多的選擇權,可以讓我們變得更開心,更自信。伴隨成長,我們的選擇權會越來越多。但在選擇權為數不多的...
    晴天有小雨Eason閱讀 147評論 0 0