对于服务器返回的JSON字符串,如果jquery异步请求没做类型说明,或者以字符串方式接受,
那么需要做一次对象化处理,方式不是太麻烦,就是将该字符串放于eval()中执行一次。
为什么要 eval这里要添加 “("("+data+")");//”呢?
原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式(expression)转化为对象,而不是作为语句(statement)来执行。
举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。
所以下面两个执行结果是不同的:
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]
$.ajax({ type:"POST",asycn:false,url:"FindCampusInfoServlet",data:{"schoolId":$("#school").val()},success : function(data) { if(data!="empty") { var objs=eval("("+data+")"); $("#campus").empty(); $("#campus").append("<option value=\"\">请选择</option>"); for(var i=0;i<objs.length;i++) { $("#campus").append("<option value=\""+objs[i].campusid+";"+objs[i].accessurl+"\">"+objs[i].campusname+"</option>"); } $("#campus").selectmenu('refresh',true); } else { $("#campus").empty(); $("#campus").append("<option value=\"\">请选择</option>"); $("#campus").selectmenu('refresh',true); } } });
2.后台Servlet处理数据,以json数据形式返回
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); String sSchoolId = request.getParameter("schoolId"); CommUseImp comm = new CommUseImp(); PrintWriter out = response.getWriter(); try { String sJson = comm.findCampus(sSchoolId); //String sRoomInfo = comm.findRoomInfo(0); if (StringUtils.isEmpty(sJson)) { out.write("empty"); out.close(); } else { JSONObject json = new JSONObject(sJson); //JSONObject json2 = new JSONObject(sRoomInfo); org.json.JSONArray jsonArray = json.getJSONArray("data"); out.write(jsonArray.toString()); out.close(); } } catch (JSONException e) { e.printStackTrace(); } }
public String findCampus(String sSchoolId) { if (StringUtils.isEmpty(sSchoolId)) { return null; } String ssql = "SELECT CAMPUSID,CAMPUSNAME,ACCESSURL FROM CAMPUS WHERE SCHOOLID='" + sSchoolId + "'"; try { StringBuilder sb = new StringBuilder(); List<Map<String,Object>> list = m_runner.query(ssql,new MapListHandler()); if (list != null && list.size() > 0) { sb.append("{'data':["); int iCount = list.size(); for (int i = 0; i < iCount; i++) { sb.append("{'campusid':'" + list.get(i).get("CAMPUSID") + "',"); sb.append("'campusname':'" + list.get(i).get("CAMPUSNAME") + "',"); sb.append("'accessurl':'" + list.get(i).get("ACCESSURL") + "'},"); } String sResult = sb.substring(0,sb.length() - 1) + "]}"; return sResult; } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } }