前台获取json未定义问题之两种常用解决办法
来自博客园的一位朋友解答: 为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被 当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。 加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式 (expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对 象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和 结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:
对于这种写法,在JS中,可以到处看到。 如: (function()) {}();? 做闭包操作时等。 注意:该例子使用的框架是spring+springmvc+mybatis plus mybatis plus 是现有mybatis的增强版 这里有更为详细介绍 代码生成器可参考:人人开源?http://www.renren.io/ 上述开源框架对于提高开发效率有很大的帮助 登录验证举例(成功例子): /**
* 登录js
*/
$(function(){
$("#btn_login").click(function(){
var mobile = $("#mobile").val();
var password = $("#pwd").val();
alert(mobile+"||"+password)
$.ajax({
url:"/LMS/user/Login",type:"POST",data : {"mobile":mobile,"password":password},dataType : 'json',success:function(data){
var json = eval("("+data+")");
if(json.returnCode=="222221"){
alert(json.returnMsg);
}else if(json.returnCode=="222222"){
alert(json.returnMsg);
}else if(json.returnCode=="000000"){
alert(json.returnMsg);
}else{
alert("有异常,请和管理员联系");
}
},error:function(){
alert("error");
}
});
});
});
? @RestController @RequestMapping("/user") public class UserController { private static Logger logger = Logger.getLogger(UserController.); @Autowired private UserService userService; @Autowired UserAuthsService userAuthsService; @RequestMapping(value="/Login",method=RequestMethod.POST,produces="application/json;charset-utf8") @ResponseBody public String Login(String mobile,String password) { logger.info("用户手机号:"+mobile); logger.info("用户密码:"+password); EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>(); wrapper.eq("mobile",mobile); UserEntity user = userService.selectOne(wrapper); EntityWrapper<UserAuthsEntity> wrapper2 = new EntityWrapper<UserAuthsEntity>(); wrapper2.eq("identifier" userAuthsService.selectOne(wrapper2); logger.info("userEntity:"+user.getMobile()); logger.info("userAuth:"+userAuth.getCredential()); Map<String,Object> map = new HashMap<String,Object>(); if(!userAuth.getIdentifier().equals(mobile)) { map.put("returnCode","222221"); map.put("returnMsg","手机号有误"); }else userAuth.getCredential().equals(password)) { map.put("returnCode","222222"else { map.put("returnCode","000000"); map.put("user"return JSON.toJSONString(map); } } ? 失败例子: ? 两个例子进行对比,前者可成功返回json数据,而后者返回未定义 而当你将data.returnMsg或data.returnCode后面的returnMsg,returnCode去掉,直接alert(data) 是可以返回数据的 返回的数据直接是以json串(json字符串的形式{}),而并未将json进行格式化,所以直接取数据导致未定义 将json格式化有两种方法: 方式一: 一种是上述 var json = eval("("+data+")"); 称之为用eval解析 方式二: var json = "{user:'user'}" var obj = new Function("return"+json)//转换后的json对象 alert(obj.name); alert(obj.age); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |