json与xml是我们进行数据传输方式,json由于其快速的提取方式经常被大家采用。
大部分的前台框架都对json格式的数据提取进行了处理,如ext,jquery等。但是当我们不用这些框架的时候,对server端的响应的json数据的处理上往往会遇到一些问题,下面是我遇到的一个郁闷了好久的问题。
当server,response的json一个时,响应结果明明为一个json对象如:
{ "programmers": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
]
}
但如果直接操作:
var people =
{ "programmers": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
]
}
people.programmers[0].firstName
确报错,没有此对象。
在此主意不要被外表所迷惑。
ajax的XMLHttpRequest响应目前只有两种格式:
一为字符串形式的响应数据,使用responseText获得。
一为XML 形式的响应数据,使用responseXML获得。
所以server的响应格式实质为String类型,而不是json类型。
所以无法直接采用操作json对象格式的形式获取数据。由此我们想到了eval,但是问题又出来了。
直接用eval方法会出项格式转化错误,那该如何解决呢?最后查阅json官网上的json.js之后发现
j = eval('(' + text + ')');
的转换方式,并测试如下
首先组装字符串:
var list = "{'list':{'codeNumber':'111111111111111'}],'totalCount':6}";
组合成了字符串list,下一步就是转换成对象了方法如下:
在字符串两端再加上括号然后eval就ok了。测试代码如下:
var list = "{'list':{'codeNumber':'111111111111111'}],'totalCount':6}";
var res =eval('('+list2+')')
alert(res);
alert(res.list[0].codeNumber);
主意只有在alert(res)为[object Object]时,才说明,此对象有可能为一个json对象而非字符串。