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

原文地址:https://www.cnblogs.com/youcong/p/8929009.html

时间: 2024-08-05 14:55:38

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

QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)

QT中获取选中的radioButton的两种方法 QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioButton* pbtn = qobject_cast<QRadioButton*>(ui->BG->checkedButton()); 2 QString name = pbtn->objectName(); 3 if(!QString::compare(name, "rad

解决IE6 IE7 JSON.stringify JSON 未定义问题

在项目中引入json2.js 官方http://www.json.org/ 源码地址:https://github.com/douglascrockford/JSON-js $.ajax({ url: '/LicXXse/Add', contentType: "application/json; charset=utf-8", type: 'POST', data: JSON.stringify(PostData),//还是这样写即可 async: true, success: fun

选中没有选中的复选框,匹配含有某个字符串的正则,json取值的两种方法,把变量定义在外面跟里面的区别

一.筛选没有选中的复选框:not("input:checked") 二.匹配有VARCHAR的字符串:".*VARCHAR.*?" 三.json取值的两种方法 var data={ "show_in_list": 1, "enums": [ { "value": "B2B", "key": "1" }, { "value": &

Json转list,两种包,两种方式

1.使用fastjson 对于json串大小写没什么要求,测试的时候,我把javaBean属性设置成和json串一样的大小写,代码如下: package com.myTest.json.test1; import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSON; public class app1 { public static void main(String[] args) { Stri

Windows校验文件哈希hash的两种常用方式

大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像.而大家如何保证自己下载回来的映像或软件就是官方版本,而没有被别人篡改过呢? 很多朋友会想到将下载回来的资源校验 MD5 或 SHA1 与官方版哈希值进行对比,如果无误则表示未被篡改.大家平常在 Windows 中都使用何种工具算校验值呢?本文向大家推荐 Windows 校验文件哈希的两种常用方式.

数据归一化和两种常用的归一化方法

数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性.原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价.以下是两种常用的归一化方法: 一.min-max标准化(Min-Max Normalization) 也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 - 1]之间.转换函数如下: 其中max为样本数据的最大

【转】数据归一化和两种常用的归一化方法

转自http://www.cnblogs.com/chaosimple/p/3227271.html 数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性.原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价.以下是两种常用的归一化方法: 一.min-max标准化(Min-Max Normalization) 也称为离差标准化

两种常用的全排列算法(java)

问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"."52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0.2都不行,5可以,将5和2交换得到"956

【方法整理】Oracle 获取trace跟踪文件名的几种常用方式

[方法整理]Oracle 获取trace跟踪文件名的几种常用方式 1  BLOG文档结构图     2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① trace跟踪文件的获取   Tips: ① 本文在itpub(http://blog.itpub.net/26736162).博客园(http://www.cnblogs.com/lhrbest)和微信公众号(xiaomaimiaolhr)有同