使用ajax与后台交互时,很多情况都是使用json格式进行数据传递,后台使用json一般有两种方式:
1.使用JSONObject。调用其fromObject方法,转化为单个的json对象。
2.使用JSONArray。调用其fromObject方法,转化为json数组。
对json的处理,有两种方式:
但如果是json数组,则不需要再加圆括号,js能把它作为json对象进行处理,原因可能是数组就是一个对象,或者js会自行当做对象处理,具体原因不详,不再需要转化为对象:
var jsonObject = eval("("+ jsonFormat +")")
加圆括号的目的是迫使 eval 函数在评估 JavaScript 代码的时候强制将括号内的表达式(expression)转换为对象,而不是作为语句(statement)来执行。举一个例子,例如对象字面量{},如 若不佳加外层的括号,那么eval会将大括号之别为JavaScript代码块的开始结束标记机,那么{}将被认为是执行了一句空语句。所以下面两个执行 结果是不同的:
alert(eval("{}")); //return undefined
alert(eval("({})")); //return [object Object]
JSON 格式的名字部分为什么要加引号?因为eval函数会将{foo:"bar"}解释成合法的JavaScript 语句,而非表达式。但人们往往是想让eval将这段代码解释成一个对象。所以JSON 格式会强制你去在名字的外侧加上引号,再结合圆括号,eval就不会错误的将JSON解释成代码块。
//eval 错误解析语义
alert(eval('{foo:"bar"}')); //return "bar",incorrect
//eval 正确解析JSON
alert(eval('({"foo":"bar"})'));//return JSON object,correct
因为eval函数会强制对参数进行运算,一般都使用parse()或者parseJson()方法,它们对传入的参数要求严格,必须传入json格式的字符串。
2.后台在对json处理之后,设置response的contentType为json:
application/json;charset='UTF-8'");
客户端浏览器,会区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据,这样,返回到页面的已经是一个json对象了,就无需再使用eval()函数转化为json对象了。
页面获取并处理了后台传入的json之后,就需要取得json中的数据进行一系列别的操作:
1.如果返回的单个的json对象,直接使用点好运算符获取key的value便可。比如:
var obj = eval('(' + str + ')');
alert(obj.name);
alert(obj.sex);
2.如果是返回的json数组,可以通过for循环依次获取json数组中的每一个对象的值:
var t2="[{name:'zhangsan',age:'24'},{name:'lisi',age:'30'},{name:'wangwu',age:'16'},{name:'tianqi',age:'7'}] ";
var myobj=eval(t2);
for(var i=0;i<myobj.length;i++){
alert(myobj[i].name);
alert(myobj[i].age);
}
更简单的方式是使用jquery的$.each()函数处理json数组:
<script>
var obj = { one: 1, two: 2, three: 3, four: 4, five: 5 };
jQuery.each( obj, function( i, val ) {
$( "#" + i ).append( document.createTextNode( " - " + val ) );
});
</script>