来自博客园的一位朋友解答:
为什么要 eval这里要添加 “("("+data+")");//”呢?
原因在于:eval本身的问题。 由于json是以”{}”的方式来开始以及结束的,在JS中,它会被
当成一个语句块来处理,所以必须强制性的将它转换成一种表达式。
加上圆括号的目的是迫使eval函数在处理JavaScript代码的时候强制将括号内的表达式
(expression)转化为对象,而不是作为语句(statement)来执行。举一个例子,例如对
象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和
结束标记,那么{}将会被认为是执行了一句空语句。所以下面两个执行结果是不同的:
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]
对于这种写法,在JS中,可以到处看到。
如: (function()) {}(); 做闭包操作时等。
注意:该例子使用的框架是spring+springmvc+mybatis plus
mybatis plus 是现有mybatis的增强版
官网为:http://mp.baomidou.com
这里有更为详细介绍
代码生成器可参考:人人开源 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=="111111"){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.class);@Autowiredprivate UserService userService;@Autowiredprivate UserAuthsService userAuthsService;@RequestMapping(value="/Login",method=RequestMethod.POST,produces="application/json;charset-utf8")@ResponseBodypublic 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", user.getMobile());UserAuthsEntity userAuth = 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", "111111");map.put("returnMsg","手机号有误");}else if(!userAuth.getCredential().equals(password)) {map.put("returnCode", "222222");map.put("returnMsg","密码错误");}else {map.put("returnCode", "000000");map.put("returnMsg","通过验证");map.put("user", user);map.put("userAuth", userAuth);} return JSON.toJSONString(map);} }
失败例子:
/*** 登录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){if(data.returnCode=="111111"){alert(data.returnMsg);}else if(data.returnCode=="222222"){alert(data.returnMsg);}else if(data.returnCode=="000000"){alert(data.returnMsg);}else{alert("有异常,请和管理员联系");}},error:function(){alert("error");}});});
});
两个例子进行对比,前者可成功返回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);