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

为什么要 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);

转载于:https://www.cnblogs.com/youcong/p/8929009.html

前台获取json未定义问题之两种常用解决办法相关推荐

  1. win10系统不识别耳机 + 扬声器产生‘啪’的电流声音两种情况——解决办法

    1. 电脑扬声器出现问题,不识别耳机 我的是Dell电脑,inspiration系列,重装了系统之后出现插入耳机不被识别,还是放外音的情况.驱动问题. 解决方法: 控制面板-->设备管理器(或右 ...

  2. 删除父节点子节点未删除的两种方法

    删除父节点子节点未删除的两种方法 平时所使用的tree删除父节点,子节点还保留在数据库. 删除前: 删除后: 父节点已删除,但数据库保留了子节点数据,以下有两种方法解决 方法一: 使用递归删除方法,我 ...

  3. 获取用户手机IP的两种方式

    安卓获取用户手机IP有两种方式,一种是通过wifi获取,一种是通过GPRS获取. 第一种wifi方式获取: 1.首先设置用户权限 <uses-permission android:name=&q ...

  4. vue 获取请求url_vue 获取url里参数的两种方法小结

    我就废话不多说了,大家还是直接看代码吧~ 第一种: const query = Qs.parse(location.search.substring(1)) let passport = query. ...

  5. 经典代码-request请求获取参数(post和get两种方式)

    request请求获取参数(post和get两种方式) https://blog.csdn.net/u012110719/article/details/44672111

  6. 获取checkbox选中状态的两种方式_张童瑶的博客

    获取checkbox选中状态的两种方式 获取checkbox选中状态的两种方式 第一种方式 第二种方式 我的其他文章 我的其他网站 获取checkbox选中状态的两种方式 我在开发项目的时候遇到这个问 ...

  7. 使用JSON.parse,解决ie6-7上JSON未定义问题

    使用JSON.parse时出现JSON未定义问题,JSON不是标准的javascript类型,一些高级的浏览器支持,但一些老一点的浏览器不支持JSON,如ie6-7.若需要ie6-7 支持JSON只需 ...

  8. js获取classname值_利用js获取元素class值的两种方法

    我们有时为了达到某种效果,需要以元素的class值为条件做判断. 我们如何利用JavaScript获取元素class的值?我们先看下面代码: x=document.getElementsByTagNa ...

  9. android获取ip方法,Android开发准确获取手机IP地址的两种方式

    最近看了好多网上获取IP地址的例子,发现好多都不完全准确,这里我写一下获取ip地址的两种方式. 比如微信支付,后台在做接口的时候,要求App端传入IP地址,我们需要判断是网络环境,WI-FI还是3G, ...

最新文章

  1. UWP开发入门(十九)——10分钟学会在VS2015中使用Git
  2. 遍历同辈节电的方法_家用节电小常识:一些行之有效的节能方法
  3. 加码IoT生态圈:爱立信携手客户及合作伙伴共筑物联网之梦
  4. 人脸识别技术大总结(1):Face Detection Alignment
  5. Memcached安装和基本使用
  6. 腾讯AI Lab刘霁谈机器学习,异步计算和去中心化是两大杀器
  7. leetcode 21 合并两个有序链表 C++
  8. python使用pkg包_Python deb-pkg-tools包_程序模块 - PyPI - Python中文网
  9. 大话图像处理之入门篇
  10. 【Elasticsearch】elasticsearch 线程池以及相关配置
  11. 5-1 可维护性的度量和构造原则
  12. Hive:用Java代码通过JDBC连接Hiveserver
  13. 软件测试管理要素分析
  14. ecshop简化购物流程
  15. 语音助手——简介与交互过程
  16. 关于采购中的PTA——概念如何理解及其计算公式
  17. 你喜欢最华为手机哪一点?网友评论亮了
  18. 微积分(三)-- 一阶常微分方程解法
  19. OPC UA学习笔记
  20. matlab分布式电源储能系统配置优化研究 面向新能源储能容量配置 储能系统定容和电力系统优化调度双层决策优化模型

热门文章

  1. mysql 索引 lt =,当同时使用gt; =和lt; =时如何索引MySQL表?
  2. 单链表进阶学习 二段
  3. POJ3614防晒霜 这个贪心有点东西(贪心+优先队列)
  4. 如何在Ubuntu中用apt命令删除/卸载软件包(remove/clean/purge)
  5. Opencv3编程入门学习笔记(二)之显式创建Mat对象
  6. 为什么很多大老板银行贷款几千万,看起来还那么潇洒?
  7. 为什么销售员贷款比较难?
  8. 为什么你总办不到大额信用卡?
  9. 《城邦暴力团》:一部奇书、反书、隐书
  10. 《命犯桃花》离斯蒂芬·金还很遥远