前台获取json未定义问题之两种常用解决办法
来自博客园的一位朋友解答:
为什么要 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); @Autowired
private UserService userService; @Autowired
private 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", 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);
前台获取json未定义问题之两种常用解决办法的更多相关文章
- js获取json属性值的两种方法
1.json.XXX 2.json["XXX"] 第二种方法使用场景,当属性值是变量时.如图所示:
- tomcat 在liunx中shutdown后进程仍然存在的两种实用解决办法
方法一: 查找tomcat进程并kill ps -elf | grep ${ctompath} | grep -v grep | awk '{print $4}' | xargs kill -9 此处 ...
- 选中没有选中的复选框,匹配含有某个字符串的正则,json取值的两种方法,把变量定义在外面跟里面的区别
一.筛选没有选中的复选框:not("input:checked") 二.匹配有VARCHAR的字符串:".*VARCHAR.*?" 三.json取值的两种方法 ...
- Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Py ...
- QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)
QT中获取选中的radioButton的两种方法 QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioBu ...
- Python3 执行JS出现JSON未定义问题
two = function(e) { var t = e.data; e.url.match(/(https?:)?(\/\/)([^/]*)/) || (e.url = "https:/ ...
- Windows校验文件哈希hash的两种常用方式
大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...
- 两种常用的jquery事件加载的方法 的区别
两种常用的jquery事件加载的方法 $(function(){}); window.onload=function(){} 第一个呢,是在DOM结构渲染完成以后调用的,这时候网页中一些资源还 ...
- iOS- 网络访问两种常用方式【GET & POST】实现的几个主要步骤
1.前言 上次,在博客里谈谈了[GET & POST]的区别,这次准备主要是分享一下自己对[GET & POST]的理解和实现的主要步骤. 在这就不多废话了,直接进主题,有什么不足的欢 ...
随机推荐
- 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动
重新安装MySQL数据库,由于安装的时候马虎,一路next(事实上,某些地方需要严格的配置,我忘记注意了),导致现在出了很多麻烦. 错误信息: 本地计算机上的MySQL服务启动后停止.某些服务在未由其 ...
- Java坦克大战(二)
本文紧接上一篇讲解坦克大战这个项目,因为当初在学习的时候,是以这个案例逐步学习Java基础的,过程是先讲知识点,再将知识点逐步的融入到项目中,即给坦克添加新的功能.之前的Demo练习,想都记录下来.这 ...
- 【原】继承AbstractRoutingDataSource再通过AOP实现动态数据源切换
关于AbstractRoutingDataSource动态切换数据源是我在研究某开源项目时候才注意到的,大概就看懂了Spring AOP切面这里,根据作者的意思是通过继承这个抽象类可以实现数据源的动态 ...
- Django Rest framework 之 解析器
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- React报错:Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix,
今天在开发时报了以下错误,记录一下 我们不能在组件销毁后设置state,防止出现内存泄漏的情况 出现原因直接告诉你了,组件都被销毁了,还设置个锤子的state啊 解决方案: 利用生命周期钩子函数:co ...
- 【代码笔记】Web-HTML-基础
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- 谈谈web上各种图片应用的优缺点
web中承载信息的主要方式就是图片与文字了,以下就是对一些web图片格式的优缺点进行归纳. 1.GIF GIF图是比较古老的web图片格式之一,可以追溯到1987,几乎所有的浏览器都支持这一种格式,老 ...
- AngularJS ui-router刷新子页面路由
网上有各种刷新子页面路由的方法,但是不知道为什么放到我的页面就不行了,尴尬! 网上的方法有: <a href="#" ui-sref="app.toMenu&quo ...
- 移动端不利用HTML5和echarts开发一样可以实现大数据展示及炫酷统计系统(产品技术综合)
一.由于项目需要进行手机看板展示设计及开发展示效果图如下:
- Kotlin入门(8)空值的判断与处理
上一篇文章介绍了如何对循环语句进行操作,末尾还演示了发现空串时直接继续下一循环,只是在初始化字符串数组时使用了“val poem2Array:Array<String?> = ***”,该 ...