1. 程式人生 > >前臺獲取json未定義問題之兩種常用解決辦法

前臺獲取json未定義問題之兩種常用解決辦法

執行 || 框架 sele {} 幫助 很大的 朋友 gin

來自博客園的一位朋友解答:

為什麽要 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未定義問題之兩種常用解決辦法