来自博客园的一位朋友解答:

为什么要 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未定义问题之两种常用解决办法的更多相关文章

  1. js获取json属性值的两种方法

    1.json.XXX 2.json["XXX"] 第二种方法使用场景,当属性值是变量时.如图所示:

  2. tomcat 在liunx中shutdown后进程仍然存在的两种实用解决办法

    方法一: 查找tomcat进程并kill ps -elf | grep ${ctompath} | grep -v grep | awk '{print $4}' | xargs kill -9 此处 ...

  3. 选中没有选中的复选框,匹配含有某个字符串的正则,json取值的两种方法,把变量定义在外面跟里面的区别

    一.筛选没有选中的复选框:not("input:checked") 二.匹配有VARCHAR的字符串:".*VARCHAR.*?" 三.json取值的两种方法 ...

  4. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  5. QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)

    QT中获取选中的radioButton的两种方法   QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioBu ...

  6. Python3 执行JS出现JSON未定义问题

    two = function(e) { var t = e.data; e.url.match(/(https?:)?(\/\/)([^/]*)/) || (e.url = "https:/ ...

  7. Windows校验文件哈希hash的两种常用方式

    大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...

  8. 两种常用的jquery事件加载的方法 的区别

    两种常用的jquery事件加载的方法   $(function(){});  window.onload=function(){}  第一个呢,是在DOM结构渲染完成以后调用的,这时候网页中一些资源还 ...

  9. iOS- 网络访问两种常用方式【GET & POST】实现的几个主要步骤

    1.前言 上次,在博客里谈谈了[GET & POST]的区别,这次准备主要是分享一下自己对[GET & POST]的理解和实现的主要步骤. 在这就不多废话了,直接进主题,有什么不足的欢 ...

随机推荐

  1. MVC 【Razor 视图引擎】基础操作 --页面跳转,传值,表单提交

    ASPX  与  Razor  仅仅是视图不一样. 新建项目----ASP.NET MVC 4 Web 应用程序------选择模板(空).视图引擎(Razor ) 1.视图中 c# 代码  与 HT ...

  2. canvas-4createPattern.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. csharp: sum columns or rows in a dataTable

    DataTable dt = setData(); // Sum rows. //foreach (DataRow row in dt.Rows) //{ // int rowTotal = 0; / ...

  4. CSS属性disabled和readonly的区别是什么

    在博客园中看到这样一篇文章,关于disabled和readonly的区别,以前还真的没有注意它们的区别,还是有必要知道它们的区别的,所以转载了. 这两个属性有类似之处,但是区别也是巨大的,之所以说类似 ...

  5. 消除2个按钮之间1px细节引起的冲突

    1.代码 <!doctype html> <html lang="en"> <head> <meta charset="UTF- ...

  6. 使用node.js进行API自动化回归测试

    概述 传统的QA自动化测试通常是基于GUI的,比如使用Selenium,模拟用户在界面上操作.但GUI测试的开发.维护成本和运行的稳定性一直是测试界的老大难问题.投入大量的人力物力开发.维护.运行,却 ...

  7. TUM数据集rgbd_benchmark工具的使用方法

    # 在学习视觉slam过程中,需要对数据集合进行预处理和对slam或者跟踪结果进行评价,TUM提供一组这样的工具,为了自己以后方便查找,于是把它记录下来 一.RGBD_Benchmark工具下载链接: ...

  8. 定时器setTimeout实现函数节流

    问题描述 文字输入查询的keyup或oninput事件,实现实时查询功能. 在用户输入过程中,用户可能只想需要 '小' 字的查询结果,但是以上两个事件会触发'x'.'i'.'a'.'o'.'小',一共 ...

  9. 安卓开发_浅谈AsyncTask

    现在就来学习一下AsyncTask. 一.先介绍一下AsyncTask: 在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给 ...

  10. maven——依赖管理

    管理包依赖是 Maven 核心功能之一,下面通过如何引入 jar 包:如何解析 jar 包依赖:包冲突是如何产生:如何解决包冲突:依赖管理解决什么问题:什么是依赖范围:使用包依赖的最佳实践等 6 个问 ...