亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js使用eval解析json(js中使用json)

2019-11-20 21:14:04
字體:
來源:轉載
供稿:網友

先來說eval的用法,內容比較簡單,熟悉的可以跳過
eval函數接收一個參數s,如果s不是字符串,則直接返回s。否則執行s語句。如果s語句執行結果是一個值,則返回此值,否則返回undefined。 需要特別注意的是對象聲明語法“{}”并不能返回一個值,需要用括號括起來才會返回值,簡單示例如下:

復制代碼 代碼如下:

var s1='"a" + 2'; //表達式
var s2='{a:2}'; //語句
alert(eval(s1)); //->'a2'
alert(eval(s2)); //->undefined
alert(eval('(' + s2 + ')')); //->[object Object]

可以看到,對于對象聲明語句來說,僅僅是執行,并不能返回值。

為了返回常用的“{}”這樣的對象聲明語句,必須用括號括住,以將其轉換為表達式,才能返回其值。這也是使用JSON來進行Ajax開發的基本原理之一。在例子中可以清楚的看到,第二個alert語句輸出的是undefined,而第三個加了括號 后輸出的是語句表示的object對象。
現在來說本文的重點,如何在函數內執行全局代碼。為了說明這個問題,先看一個例子:

復制代碼 代碼如下:

var s='global'; //定義一個全局變量
function demo1(){
    eval('var s="local"');
}
demo1();
alert(s); //->global

很好理解,上面的demo1函數等價于:function demo1(){var s='local';},其中定義了一個局部變量s。
所以最后的輸出是global并不是什么奇怪的事情,畢竟大家都能很清楚的區分局部變量和全局變量。
仔細體會一下,可以發現eval函數的特點,它總是在調用它的上下文變量空間(也稱為:包,closure)內執行,無論是變量定義還是函數定義都是如此,所以如下的代碼會產生函數未定義的錯誤:

復制代碼 代碼如下:

var s='function test(){return 1;}'; //一個函數定義語句
function demo2(){
    eval(s);
}
demo2();
alert(test()); //->error:test is not defined

這是因為test函數在局部空間定義,demo2函數內可以訪問到,外面就訪問不到了。

分享:用Js的eval解析JSON中的注意點
在JS中將JSON的字符串解析成JSON數據格式,一般有兩種方式:

1.一種為使用eval()函數。

2. 使用Function對象來進行返回解析。

使用eval函數來解析,并且使用jquery的each方法來遍歷

用jquery解析JSON數據的方法,作為jquery異步請求的傳輸對 象,jquery請求后返回的結果是json對象,這里考慮的都是服務器 返回JSON形式的字符串的形式,對于利用JSONObject等插件封裝的JSON對象,與此亦是大同小異,這里不再做說明。
這里首先給出JSON字符串集,字符串集如下:

復制代碼 代碼如下:

var data="
{
root:
[
{name:'1',value:'0'},
{name:'6101',value:'北京市'},
{name:'6102',value:'天津市'},
{name:'6103',value:'上海市'},
{name:'6104',value:'重慶市'},
{name:'6105',value:'渭南市'},
{name:'6106',value:'延安市'},
{name:'6107',value:'漢中市'},
{name:'6108',value:'榆林市'},
{name:'6109',value:'安康市'},
{name:'6110',value:'商洛市'}
]
}";

這里以jquery異步獲取的數據類型――json對象和字符串為依據,分別介紹兩種方式獲取到的結果處理方式。

1.對于服務器返回的JSON字符串,如果jquery異步請求沒做類型說明,或者以字符串方式接受,那么需要做一次對象化處理,方式不是太麻煩,就是將該字符串放于eval()中執行一次。這種方式也適合以普通javascipt方式獲取json對象,以下舉例說明:

var dataObj=eval("("+data+")");//轉換為json對象

為什么要 eval這里要添加 “("("+data+")");//”呢?

原因在于:eval本身的問題。 由于json是以”{}”的方式來開始以及結束的,在JS中,它會被當成一個語句塊來處理,所以必須強制性的將它轉換成一種表達式。

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

復制代碼 代碼如下:

alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]

對于這種寫法,在JS中,可以到處看到。

如: (function()) {}();  做閉包操作時等。

復制代碼 代碼如下:

alert(dataObj.root.length);//輸出root的子對象數量
$.each(dataObj.root,fucntion(idx,item){
if(idx==0){
return true;
}
//輸出每個root子對象的名稱和值
alert("name:"+item.name+",value:"+item.value);
})

注:對于一般的js生成json對象,只需要將$.each()方法替換為for語句即可,其他不變。

2.對于服務器返回的JSON字符串,如果jquery異步請求將 type(一般為這個配置屬性)設為“json”,或者利 用$.getJSON()方法獲得服務器返回,那么就不需要eval()方法了,因為這時候得到的結果已經是json對象了,只需直接調用該對象即可,這 里以$.getJSON方法為例說明數據處理方法:

復制代碼 代碼如下:

$.getJSON("http://www.xx.cn/",{param:"gaoyusi"},function(data){
//此處返回的data已經是json對象
//以下其他操作同第一種情況
$.each(data.root,function(idx,item){
if(idx==0){
return true;//同countinue,返回false同break
}
alert("name:"+item.name+",value:"+item.value);
});
});

這里特別需要注意的是方式1中的eval()方法是動態執行其中字符串(可能是js腳本)的,這樣很容易會造成系統的安全問題。所以可以采用一些規避了eval()的第三方客戶端腳本庫,比如JSON in JavaScript就提供了一個不超過3k的腳本庫。

第二種解析方式就是使用Function對象來完成,它的典型應用就是在JQUERY中的AJAX方法下的success等對于返回數據data的解析

復制代碼 代碼如下:

var json='{"name":"CJ","age":18}';

data =(new Function("","return "+json))();


此時的data就是一個會解析成一個 json對象了

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩亚洲欧美中文在线| 91久久久久久国产精品| 91精品久久久久| 国产欧美一区二区三区四区| 欧美成年人在线观看| 91视频88av| 久久久久久高潮国产精品视| 久久视频中文字幕| 欧美大片欧美激情性色a∨久久| 91社区国产高清| 亚洲欧美一区二区三区情侣bbw| 欧美在线视频一区| 97免费在线视频| 久久久精品久久| 不卡在线观看电视剧完整版| 国产成人精品久久二区二区| 久色乳综合思思在线视频| 欧美人在线观看| 91精品国产自产91精品| 国产在线高清精品| 日韩精品中文在线观看| 欧美裸身视频免费观看| 国产v综合v亚洲欧美久久| 国产丝袜视频一区| 国产偷亚洲偷欧美偷精品| 丝袜情趣国产精品| 国产日韩在线免费| 亚洲韩国日本中文字幕| 欧洲成人午夜免费大片| 亚洲成人精品av| 欧美激情奇米色| 成人黄色免费网站在线观看| 精品国产依人香蕉在线精品| 在线播放日韩精品| 欧美精品videos| 亚洲精品久久久久| 日韩在线观看免费| 欧美精品videossex性护士| 欧美成人免费视频| 亚洲成人激情小说| 亚洲人成网站色ww在线| 亚洲欧洲日产国码av系列天堂| 日本最新高清不卡中文字幕| 北条麻妃一区二区三区中文字幕| 日本国产一区二区三区| 97成人在线视频| 欧美www在线| 亚洲大胆美女视频| 亚洲精品福利视频| 一二美女精品欧洲| 欧美色道久久88综合亚洲精品| 亚洲精品黄网在线观看| 国产精品高潮呻吟久久av野狼| 亚洲精品狠狠操| 中文字幕精品国产| 日韩免费在线播放| 国产大片精品免费永久看nba| 亚洲成人国产精品| 日韩欧美亚洲国产一区| 5566成人精品视频免费| 国产在线999| 国产成人福利视频| 国产99久久精品一区二区永久免费| 亚洲最大成人在线| 日韩大片免费观看视频播放| 97精品国产aⅴ7777| 中文字幕日韩精品在线| 亚洲人永久免费| 欧美色道久久88综合亚洲精品| 午夜精品福利在线观看| 国产精品福利无圣光在线一区| 国产亚洲一区二区精品| 久久精品2019中文字幕| 国产精品久久久久不卡| 成人性生交xxxxx网站| 日韩欧美一区视频| 国产精品男人的天堂| 国产精品久久一区主播| 久久青草精品视频免费观看| 欧美做爰性生交视频| 隔壁老王国产在线精品| 一区二区三区精品99久久| 中文字幕精品久久久久| 高清在线视频日韩欧美| 欧美一级电影在线| 97国产在线视频| 国产亚洲一级高清| 久久91超碰青草是什么| 中文字幕综合一区| 欧美电影免费观看网站| 欧美xxxx综合视频| 日韩网站免费观看高清| 欧美日韩国产色视频| 亚洲精品二三区| 国产精品午夜一区二区欲梦| 国产精品欧美一区二区| 亚洲在线观看视频网站| 亚洲色图第一页| 亚洲美女精品久久| 亚洲欧美日韩中文在线| 国产一区二区在线免费视频| 国产精品极品美女在线观看免费| 精品视频在线导航| 国产精品视频自在线| 国产一区二区在线播放| 亚洲视频免费一区| 亚洲美女黄色片| 神马国产精品影院av| 精品国产欧美一区二区五十路| 欧美成年人网站| 2019精品视频| 久久久久久久激情视频| 成人国产精品久久久| 91亚洲国产成人久久精品网站| 国产亚洲精品综合一区91| 日韩欧美中文免费| 岛国精品视频在线播放| 亚洲日本aⅴ片在线观看香蕉| 日韩日本欧美亚洲| 韩剧1988在线观看免费完整版| 日韩中文视频免费在线观看| www亚洲欧美| 亚洲久久久久久久久久| 日韩在线www| 亚洲精品丝袜日韩| 久久久国产精品免费| 精品自在线视频| 91精品国产99久久久久久| 亚洲精品二三区| 亚洲男人av在线| 国产99久久精品一区二区| 欧美亚洲另类在线| 国语自产精品视频在线看抢先版图片| 欧美另类精品xxxx孕妇| 亚洲男人的天堂网站| 国产精品第2页| 欧美视频在线看| 热re91久久精品国99热蜜臀| 成人精品视频在线| 在线观看国产精品91| 久久久久国产一区二区三区| 国产成人+综合亚洲+天堂| 国产精品永久免费观看| 日韩中文字幕在线观看| 国产精品一二区| 欧美激情视频一区二区| 国产精品色悠悠| 欧美乱人伦中文字幕在线| 日韩欧美视频一区二区三区| 欧美日韩国产第一页| 日韩av大片在线| 国产精品一区二区三区成人| 91精品综合久久久久久五月天| 91成人天堂久久成人| 亚洲欧美精品一区二区| 精品亚洲精品福利线在观看| 亚洲成人久久久久| 亚洲精品98久久久久久中文字幕| 久久久免费高清电视剧观看| 原创国产精品91| 精品无人区乱码1区2区3区在线| 亚洲欧美日韩精品久久亚洲区| 日本韩国欧美精品大片卡二| 成人a级免费视频|