• 前台获取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);

  • 相关阅读:
    LUOGU P4113 [HEOI2012]采花
    LUOGU P4251 [SCOI2015]小凸玩矩阵
    bzoj 3230 相似子串——后缀数组
    bzoj 4453 cys就是要拿英魂!——后缀数组+单调栈+set
    洛谷 5061 秘密任务——二分图染色
    bzoj 4104 [Thu Summer Camp 2015]解密运算——思路
    bzoj 4319 cerc2008 Suffix reconstruction——贪心构造
    poj 3415 Common Substrings——后缀数组+单调栈
    CF 504E Misha and LCP on Tree——后缀数组+树链剖分
    bzoj 4278 [ONTAK2015]Tasowanie——后缀数组
  • 原文地址:https://www.cnblogs.com/youcong/p/8929009.html
Copyright © 2020-2023  润新知