前端json的簡介,轉換和解析

最近碰到json的問題比較多,做個總結,比較簡單,也比較入門,希望能幫助那些職場初級前端能對json有一個新的認識,若有錯誤之處,歡迎指正。

就拿最近的一個項目做例子:

項目模塊需求:

用戶選擇一級下拉菜單,同時二級菜單內容動態顯示,並且二級聯動下方的內容部分動態生成相應查詢內容。

實現起來也很簡單:

用戶選擇一級下拉菜單時,傳值到後臺,後臺查表處理後,返回json格式數據到前端,前端再對json做處理,在二級菜單下拉框裏生成option內容,並且在下方內容空白處,動態生成查詢內容。

其實,可以看出前端後端之間離不開json和xml,json作爲前後端的橋樑有着諸多優勢,並且json和javescript簡直是天造地設的一對,js處理json是十分方便的事情。下面我就來簡單介紹一下json以及它的用法。

以下分爲四塊內容:

1. json的數據格式   2. json字符串轉json數據對象   3. json數據對象轉json字符串    4. json的取值

一、.json的數據格式 

1.JSON對象(JSONObject

簡單一點的:

{"name":"西蘭花的春天" , "age":"26" , "male":"true"}
複雜一點的:
{ 
   "name":"西蘭花的春天",
   "age":"26", 
   "male":"true", 
   "address":{ "name":"helen", "city":"杭州", "country":"中國" }
}
2.JSON數組(JSONArray

簡單一點的:

[
   { "name":"西蘭花的春天", "age":"30", "male":"true" },
   { "name":"孫xx", "age":"30", "male":"false" },
   { "name":"陳xx", "age":"30", "male":"true" },
   { "name":"張x", "age":"30", "male":"true" }
]
複雜一點的:
{
   "helen":{
      "技術運營部":[
         {
            "人員":"5",
            "男人":"4",
            "女人":"1",
            "人員構成":{
               "帶頭大哥":"陳xx",
               "前端":[
                  {
                     "前端1":"孫xx",
                     "前端1特點":"技術天才",
                     "前端2":"西蘭花的春天",
                     "前端2特點":"技術天才"
                  }
               ],
               "後端":[
                  {
                     "後端1":"陳xx",
                     "後端1特點":"技術天才",
                     "後端2":"張x",
                     "後端2特點":"技術天才"
                  }
               ]
            }
         },
         {
            "人員":"2",
            "男人":"2",
            "女人":"0",
            "人員構成":{
               "帶頭大哥":"張xx",
               "運維":[
                  {
                     "運維1":"孫xx",
                     "運維1特點":"技術天才"
                  }
               ]
            }
         }
      ]
   }
}

標準JSON的合法符號:{(左大括號)  }(右大括號)  "(雙引號)  :(冒號)  ,(逗號)  [(左中括號)  ](右中括號),也就是說json格式裏面嚴格意義上鍵值要加雙引號,每個鍵值對之間要加逗號,末尾不能有逗號,中括號和大括號要合理使用。

json格式如實不規範使用,則會導致JSON.parse()解析錯誤,一定程度上,也會導致eval()方法報錯。

二、json字符串轉json數據對象

(1)JSON.parse()方法

JSON.parse()方法只支持IE8/Firefox3.5+/Chrome4/Safari4/Opera10 以上版本

ie8(兼容模式),ie7和ie6沒有JSON對象,推薦採用JSON官方的方式,引入json2.js。

var jsonStr = '{"name":"西蘭花的春天" , "age":"26" , "male":"true"}';
var jsonObj = JSON.parse( jsonStr );
console.log( jsonObj );

(2)eval()方法

解析JSON數據的最常用方法是使用javascript的eval()方法,ie8(兼容模式),ie7和ie6也可以使用eval()將字符串轉爲JSON對象

var jsonStr = '{"name":"西蘭花的春天" , "age":"26" , "male":"true"}';
var jsonObj = eval( '(' + jsonStr + ')' );
console.log( jsonObj );

(3)$.parseJSON方法

var jsonStr = '{"name":"西蘭花的春天" , "age":"26" , "male":"true"}';
var jsonObj = $.parseJSON( jsonStr );
console.log( jsonObj );

(4)new Function方法

var jsonStr = '{"name":"西蘭花的春天" , "age":"26" , "male":"true"}';
function toJson( jsonStr )
{
   var jsonObj = (new Function( "return " + jsonStr ))();
   console.log( jsonObj );
   return jsonObj;
}

這裏注意一下:

1.運用時候需要除了eval()以外需要json2.js包。鏈接下載地址:https://github.com/douglascrockford/JSON-js

2.json2.js會在瀏覽器原生支持JSON.parse的時候選用原生版本,而且它跟ES5是API兼容的。在ES5還沒完全普及的現狀下,John Resig推薦用json2.js主要是爲了現在就能用跟ES5兼容的API。

3.這裏我重點提一下eval

eval在項目中要慎重使用,關於eval的好壞我不做評價,我覺得前端開發一定要有哲學思想,需要辯證的看待問題,凡事沒有絕對的好壞,編程的語言選擇必須切實根據實際項目來做取捨,思維要有彈性,這裏放個鏈接,有興趣可以去看一下:https://www.zhihu.com/question/20591877

這裏我就提一下用eval解析會碰到的問題

1.如下所示

var jsonStr = '{"name":"西蘭花的春天" , "age":"26" , "male":"true"}';
var jsonObj = eval( jsonStr );
console.log( jsonObj );
則報錯:

在看下面:
alert(eval("{}")) // return undefined
alert(eval("({})"));// return object[Object]

加上圓括號的目的是迫使eval函數在處理JavaScript代碼的時候強制將括號內的表達式(expression)轉化爲對象,而不是作爲語 句(statement)來執行。舉一個例子,例如對象字面量{},如若不加外層的括號,那麼eval會將大括號識別爲JavaScript代碼塊的開始 和結束標記,那麼{}將會被認爲是執行了一句空語句。所以下面兩個執行結果是不同的。

再把eval()改爲:eval(‘(‘+json+’)’)格式:

var jsonStr = '{"name":"西蘭花的春天" , "age":"26" , "male":"true"}';
var jsonObj = eval( '(' + jsonStr + ')' );
console.log( jsonObj );
則成功輸出。
2.若是如下所示解析:
var jsonStr = '{name:"西蘭花的春天" ;age:"26" ; male:"true"}';
var jsonObj = eval( jsonStr );
console.log( jsonObj );

一旦一個對象有了若干個 key,比如{ name:"西蘭花的春天" ;age:"26" ; male:"true" }就有三個 label 語句,將 "name" ,age以及male分別看做是語句語句之間只能用分號連接!(表達式之間才能用逗號),會返回最後一個的值,所以改成上面這樣也是沒有問題的。

3.若是如下所示解析:

var jsonStr = "{'name':'西蘭花的春天' , 'age':'26' , 'male':alert('西蘭花的春天')}";
var jsonObj = eval( '(' + jsonStr + ')' );
console.log( jsonObj );

我們發現打印出這種結果

jsonStr其實不是嚴格意義上的json格式,eval還是解析出來了,而JSON.parse()方法解析時則會報錯,我麼可以看出,eval十分強大,但也涉及到安全性問題,惡意用戶可在往json里加入木馬腳本,故能不用eval就不要採納。

三、json數據對象轉json字符串

(1)JSON.stringify(obj) 方法

var jsonObj = { 'name': "西蘭花的春天", "age": "26", "male": "true" };
var str = JSON.stringify( jsonObj );
console.log( str );
(2)obj.toJSONString()方法
var jsonObj = { 'name': "西蘭花的春天", "age": "26", "male": "true" };
var str = jsonObj.toJSONString();
console.log( str );
注意:

以上兩個方法,只能在IE8或者以上,toJSONString() , 必須要引入json.js,如要在ie8兼容模式以下版本使用,則要加載json2.js拓展,所以說侷限性都比較高。不過,個人建議使用JSON.stringify(obj) 方法比較好。

四、json的取值

{
   "helen":{
      "技術運營部":[
         {
            "人員":"5",
            "男人":"4",
            "女人":"1",
            "人員構成":{
               "帶頭大哥":"陳xx",
               "前端":[
                  {
                     "前端1":"孫xx",
                     "前端1特點":"技術天才",
                     "前端2":"西蘭花的春天",
                     "前端2特點":"技術天才"
                  }
               ],
               "後端":[
                  {
                     "後端1":"陳xx",
                     "後端1特點":"技術天才",
                     "後端2":"張x",
                     "後端2特點":"技術天才"
                  }
               ]
            }
         },
         {
            "人員":"2",
            "男人":"2",
            "女人":"0",
            "人員構成":{
               "帶頭大哥":"張xx",
               "運維":[
                  {
                     "運維1":"孫xx",
                     "運維1特點":"技術天才"
                  }
               ]
            }
         }
      ]
   }
}
<script>
$( document ).ready( readyHandler );
function readyHandler()
{
   $.get( "helen.json", function( data )                               //data作爲參數傳入
   {
      //若我要取到"前端2"的值
      console.log( data.helen.技術運營部[ 0 ].人員構成.前端[ 0 ].前端2 );
   } );
}
</script>

這裏獲取的json直接就是json標準格式,不需要解析,直接取值。

如下,成功輸出我要的值:西蘭花的春天大笑大笑

原先我取值的時候總是出錯,後來花了幾分鐘想了下,明白其中的道理。json解析取值,簡單點去想,就是複雜json由json對象和json數組混合構成,取值就像剝洋蔥,一層一層下去,碰到對對象,就用.xx方法,碰到數組,就用.x[i]方法,心細一點,別寫錯,肯定不會錯,無論多複雜的json,都是這麼操作這,沒什麼難度把。

至此,json大致說完了,比較簡單易懂,也沒什麼難度,就這麼回事,希望看完能有所幫助。

發佈了15 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章