jquery eval()解析JSON,ajax通過return返回數據,js讀取解析JSON數據

一,在JS中將JSON的字符串解析成JSON數據格式,一般有兩種方式:

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

  1. 使用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()evaljson調 .getJSON方法爲例說明數據處理方法:

$.getJSON("http://www.phpzixue.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對象了.

二,ajax通過return返回數據
1. ajax 必須爲同步 設置async:false
2. 定一個局部變量 把data賦值給局部變量 然後 return 局部變量即可
示例如下

function getEmpCount(item, state) {  
    var value = "";  
    $.ajax({  
        url: "/handler/getempcount.ashx",  
        async:false,  
        data: { depid: item.id, state: state, orgid: item.orgid },  
        success: function (data) {  
            //alert(data);  
            value = data;  
        }  
    });  
    return value;  
}   

三,js讀取解析JSON數據
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,採用完全獨立於語言的文本格式,是理想的數據交換格式。同時,JSON是 JavaScript 原生格式,這意味着在 JavaScript 中處理 JSON數據不須要任何特殊的 API 或工具包。

本文主要是對JS操作JSON的要領做下總結。



在JSON中,有兩種結構:對象和數組。



1. 一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”後跟一個“:”(冒號);“‘名稱/值’ 對”之間運用 “,”(逗號)分隔。 名稱用引號括起來;值如果是字符串則必須用括號,數值型則不須要。例如:



var o={"xlid":"cxh","xldigitid":123456,"topscore":2000,"topplaytime":"2009-08-20"};



2. 數組是值(value)的有序集合。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間運用 “,”(逗號)分隔。



例如:



var jsonranklist=[{"xlid":"cxh","xldigitid":123456,"topscore":2000,"topplaytime":"2009-08-20"},{"xlid":"zd","xldigitid":123456,"topscore":1500,"topplaytime":"2009-11-20"}];



爲了方便地處理JSON數據,JSON提供了json.js包,下載地址:http://www.json.org/json.js



在數據傳輸流程中,json是以文本,即字符串的形式傳遞的,而JS操作的是JSON對象,所以,JSON對象和JSON字符串之間的相互轉換是關鍵。例如:



JSON字符串:



var str1 = '{ "name": "cxh", "sex": "man" }';



JSON對象:



var str2 = { "name": "cxh", "sex": "man" };



一、JSON字符串轉換爲JSON對象



要運用上面的str1,必須運用下面的要領先轉化爲JSON對象:



//由JSON字符串轉換爲JSON對象



var obj = eval('(' + str + ')');

或者

var obj = str.parseJSON(); //由JSON字符串轉換爲JSON對象



或者



var obj = JSON.parse(str); //由JSON字符串轉換爲JSON對象



然後,就可以這樣讀取:



Alert(obj.name);



Alert(obj.sex);



特別留心:如果obj本來就是一個JSON對象,那麼運用 eval()函數轉換後(哪怕是多次轉換)還是JSON對象,但是運用 parseJSON()函數處理後會有疑問(拋出語法異常)。



二、可以運用 toJSONString()或者全局要領 JSON.stringify()將JSON對象轉化爲JSON字符串。



例如:



var last=obj.toJSONString(); //將JSON對象轉化爲JSON字符



或者



var last=JSON.stringify(obj); //將JSON對象轉化爲JSON字符



alert(last);

數據組

var str=’[{“name”:”cxh”,”sex”:”man”},{“name”:”cxh1”,”sex”:”man1”}]’;

var obj = str.parseJSON();

alert(obj[0].name)

留心:



上面的多個要領中,除了eval()函數是js自帶的之外,其他的多個要領都來自json.js包。新版本的 JSON 修改了 API,將 JSON.stringify() 和 JSON.parse() 兩個要領都注入到了 Javascript 的內建對象裏面,前者變成了 Object.toJSONString(),而後者變成了 String.parseJSON()。如果提示找不到toJSONString()和parseJSON()要領,則說明您的json包版本太低。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章