Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 584|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-14 16:58:31 | 显示全部楼层 |阅读模式

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

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 05:50 , Processed in 0.062870 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表