文档章节

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

o
 osc_x4h57ch8
发布于 2018/04/24 12:57
字数 770
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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

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

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

JIT的Profile神器JITWatch

点击上方的蓝字关注我吧 程序那些事 简介 老是使用命令行工具在现代化社会好像已经跟不上节奏了,尤其是在做JIT分析时,使用LogCompilation输出的日志实在是太大了,让人望而生畏。有没有什么...

flydean
07/04
0
0
运维基础--虚拟机的使用(一)

虚拟机的使用 开始使用Linux操作系统时,首先可能会接触到两个主要的界面:GUI和CLI,即图形界面个命令界面,而运维一般极少使用到图形界面。 一、命令提示符的格式:[root@mylab11~] # roo...

osc_9os5791s
11分钟前
0
0
以程序员的方式,尽绵薄之力

作为程序员,我们不能冲在第一线,参与病毒防疫工作,我们希望通过我们的方式,让更多的人获取到关于疫情的有用的消息,正确的消息 虽然github可能是个相对小众的平台,对于非程序员来说,可...

Jipson
01/26
0
0
Oracle 等待事件之 db file scattered read

db file scattered read 官网解释: This event signifies that the user process is reading buffers into the SGA buffer cache and is waiting for a physical I/O call to return. A db......

osc_qlj7m2h9
12分钟前
0
0
互联网+时代的畅想

封面的台风卫星照片,我认为很形象地可以看作互联网的那一波浪潮。在智能手机普及的初始阶段,还记得我们对于互联网的狂热,有人说要用互联网颠覆一切,亦有人要用互联网干一切事情,当然,这...

zd200572
2015/09/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部