jQuery的Ajax请求,返回JSON数据,但是在success里无法获取数据

时间:2022-12-03 18:59:03
jQuery的Ajax请求,返回JSON数据,但是在success里无法获取数据
这是Ajax请求,alert(data)时,没有反应!
这是JSON返回数据:
请求路径:http://localhost:8080/admin/region/region!loadNext.do
jQuery的Ajax请求,返回JSON数据,但是在success里无法获取数据
错在哪里呢?

20 个解决方案

#1


'===>改为"

你的jquery版本应该是1.4+以上的,怪异json字符不执行success回调,参考: jQuery dataType指定为json的问题

#2


引用 1 楼 showbo 的回复:
'===>改为"

你的jquery版本应该是1.4+以上的,怪异json字符不执行success回调,参考: jQuery dataType指定为json的问题

我按照你的方法改了果然可以了、但是在each时报length为空或不是对象、下拉菜单只添加了<--请选择-->
其余的值没有新增成功

#3


没注意看,你的JSON结构也错了,数组的键名称没有指定。。

加上value

{"success":true, "value":[......

#4


引用 3 楼 showbo 的回复:
没注意看,你的JSON结构也错了,数组的键名称没有指定。。

加上value

{"success":true, "value":[......


我现在的json:
{"success":true,"value":[{"id":"2","regionType":"1","regionNameZh":"北京市","regionParentId":"3525"}]"}

jquery代码:
$.ajax({
type : "POST",
url : "../region/region!loadNext.do",
dataType : "json",
complete : function(data) {
$("#habitatRegion2").empty();
$("#habitatRegion2").append("<option value=''>--请选择--</option>");
var jsonData = unescape(data.responseText);
//使用$each(data,function(index,item)  这种方式时,alert(item.regionNameZh) 是undefine
//使用$each(data.value,function(index,item)  这种方式时,报错:length为空或不是对象
//使用$each(jsonData,function(index,item)  这种方式时,alert(item.regionNameZh) 是undefine
//使用$each(jsonData.value,function(index,item)  这种方式时,报错:length为空或不是对象
$.each(jsonData, function(index, item){
alert(item.regionNameZh); 
//$("#habitatRegion2").append("<option value='"+item.id+"'>"+item.regionNameZh+"</option>");
});
}


到底是为什么,我很纠结啊!

#5


$.each(jsonData
改为$.each(jsonData.value

#6


本帖最后由 showbo 于 2013-07-16 16:28:12 编辑
 var jsonData = unescape(data.responseText);    
这句有问题,data参数已经是json对象了,不需要再声明jsonData,而且生成json对象时eval,不是unescape


            $.each( data.value, function(index, item){
                alert(item.regionNameZh); 
                //$("#habitatRegion2").append("<option value='"+item.id+"'>"+item.regionNameZh+"</option>");
            });    



{"success":true,"value":[{"id":"2","regionType":"1","regionNameZh":"北京市","regionParentId":"3525"}] "}

这里多了一个",不知道是不是手误打上去的

#7


引用 6 楼 showbo 的回复:
 var jsonData = unescape(data.responseText);    
这句有问题,data参数已经是json对象了,不需要再声明jsonData,而且生成json对象时eval,不是unescape


            $.each( data.value, function(index, item){
                alert(item.regionNameZh); 
                //$("#habitatRegion2").append("<option value='"+item.id+"'>"+item.regionNameZh+"</option>");
            });    



{"success":true,"value":[{"id":"2","regionType":"1","regionNameZh":"北京市","regionParentId":"3525"}] "}

这里多了一个",不知道是不是手误打上去的

前辈,我按照你的方法改了,我的java方法返回值是String,我在return jsonStr之前还out.write(jsonStr)
  $each  data时也改成data.value,并且在$each之前我alert一下data,弹出的是[object XMLHttpRequest],但是确认后,下拉菜单没有添加成功,报错为:length为空或不是对象  jquery.min.js 32行

#8


success的data参数不可能是XMLHttpRequest对象啊,要么字符串,要么就jquery处理后的json对象

直接浏览器访问../region/region!loadNext.do输出的内容是什么?是修改好后的json格式的字符串数据没有?

#9


引用 8 楼 showbo 的回复:
success的data参数不可能是XMLHttpRequest对象啊,要么字符串,要么就jquery处理后的json对象

直接浏览器访问../region/region!loadNext.do输出的内容是什么?是修改好后的json格式的字符串数据没有?

直接访问,打印的就是{"success":true,"value":[{"id":"2","regionType":"1","regionNameZh":"北京市","regionParentId":"3525"}]}这种格式的字符串

#10


那应该木有问题啊,是执行到success回调了吧,那么success:function( data),data参数不会是ajax对象的

楼主什么版本的jquery?

#11


重新梳理一下:
java代码(json格式进行了修改。去掉了succes:true,value:):
public String loadNext()
    {
        if (region == null)
        {
            region = new Region();
            region.setRegionType(1);
            //region.setParentId(0);
        }
        regions = regionServiceImpl.getNextList(region);
        StringBuffer sb = new StringBuffer();
        sb.append("[");
        if (regions.size() > 0)
        {
            int size = regions.size();
            int count = 0;
            for (Region region : regions)
            {
                count++;
                if (region.getPassed() == 0)
                {
                    sb.append("{");
                    sb.append("\"id\":\"" + region.getId() + "\",");
                    sb.append("\"regionType\":\"" + region.getRegionType() + "\",");
                    sb.append("\"regionNameZh\":\"" + region.getRegionNameZh()
                            + "\",");
                    sb.append("\"regionParentId\":\"" + region.getParentId());
                    sb.append("\"}");
                    if (size != count)
                    {
                        sb.append(",");
                    }
                }
            }
        }
        sb.append("]");
        regionStr = sb.toString();
        response.setCharacterEncoding("utf-8");
        PrintWriter out = null;
        try
        {
            out = response.getWriter();
            out.print(regionStr);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            out.flush();
            out.close();
        }
        return null;
    }

struts.xml配置
	<package name="region" extends="struts-default">
<action name="region_*" class="com.beyondsoft.esite.action.region.RegionAction" method="{1}">

</action>
</package>

jsp页面代码:

$.ajax({
type : "POST",
url : "../region/region!loadNext.do",
dataType : "json",
success : function(data) {
$("#habitatRegion2").empty();
$("#habitatRegion2").append("<option value=''>--请选择--</option>");
alert(data) //弹出是 object XMLHttpRequest
$.each(data.value, function(i, item){ //在这里就报错:length为空或不是对象
alert(item.regionNameZh);
$("#habitatRegion2").append("<option value='"+item.id+"'>"+item.regionNameZh+"</option>");
});
}
});

#12


本帖最后由 showbo 于 2013-07-17 09:40:12 编辑
去掉value,$.each就要改了,已经变成数组,

 alert(data) //弹出是 object XMLHttpRequest,success回调函数的参数没见过有传递ajax对象
//如果确实是xhr对象,你的jquery应该是被改动过了。

 alert(data.responseText) //输出看看什么内容

//如果data为xhr,只能eval动态生成json对象了

data=eval('('+data.responseText+')')
 $.each(data, function(i, item){ //在这里就报错:length为空或不是对象
                alert(item.regionNameZh);
                $("#habitatRegion2").append("<option value='"+item.id+"'>"+item.regionNameZh+"</option>");
            });
 

#13


$.post("请求url",function(data){
   $.each(data.Data,function(i,item){
       alert(item.id);
   });
},"json");

#14


是不是忘记添加json.js的引用了

#15


换一种呢

$.ajax({
 ....,
 dataType:'text',
 success:function(data){
   rst_json = eval('('+data+')');
 }
})

#16


success:function(datas)的success和:之间多打了空格。。。是这个原因,我被坑了好久

#17


我也被这个空格问题坑了

#18


{"success":true} 这是我的 返回结果,没空格  也是双引号  可还就总进error  不进success里  到现在 坑了一天了  求解答啊

#19


楼主解决了吗?我现在也被这个问题坑了

#20


有可能是访问跨域问题,API后台需要允许这个

#1


'===>改为"

你的jquery版本应该是1.4+以上的,怪异json字符不执行success回调,参考: jQuery dataType指定为json的问题

#2


引用 1 楼 showbo 的回复:
'===>改为"

你的jquery版本应该是1.4+以上的,怪异json字符不执行success回调,参考: jQuery dataType指定为json的问题

我按照你的方法改了果然可以了、但是在each时报length为空或不是对象、下拉菜单只添加了<--请选择-->
其余的值没有新增成功

#3


没注意看,你的JSON结构也错了,数组的键名称没有指定。。

加上value

{"success":true, "value":[......

#4


引用 3 楼 showbo 的回复:
没注意看,你的JSON结构也错了,数组的键名称没有指定。。

加上value

{"success":true, "value":[......


我现在的json:
{"success":true,"value":[{"id":"2","regionType":"1","regionNameZh":"北京市","regionParentId":"3525"}]"}

jquery代码:
$.ajax({
type : "POST",
url : "../region/region!loadNext.do",
dataType : "json",
complete : function(data) {
$("#habitatRegion2").empty();
$("#habitatRegion2").append("<option value=''>--请选择--</option>");
var jsonData = unescape(data.responseText);
//使用$each(data,function(index,item)  这种方式时,alert(item.regionNameZh) 是undefine
//使用$each(data.value,function(index,item)  这种方式时,报错:length为空或不是对象
//使用$each(jsonData,function(index,item)  这种方式时,alert(item.regionNameZh) 是undefine
//使用$each(jsonData.value,function(index,item)  这种方式时,报错:length为空或不是对象
$.each(jsonData, function(index, item){
alert(item.regionNameZh); 
//$("#habitatRegion2").append("<option value='"+item.id+"'>"+item.regionNameZh+"</option>");
});
}


到底是为什么,我很纠结啊!

#5


$.each(jsonData
改为$.each(jsonData.value

#6


本帖最后由 showbo 于 2013-07-16 16:28:12 编辑
 var jsonData = unescape(data.responseText);    
这句有问题,data参数已经是json对象了,不需要再声明jsonData,而且生成json对象时eval,不是unescape


            $.each( data.value, function(index, item){
                alert(item.regionNameZh); 
                //$("#habitatRegion2").append("<option value='"+item.id+"'>"+item.regionNameZh+"</option>");
            });    



{"success":true,"value":[{"id":"2","regionType":"1","regionNameZh":"北京市","regionParentId":"3525"}] "}

这里多了一个",不知道是不是手误打上去的

#7


引用 6 楼 showbo 的回复:
 var jsonData = unescape(data.responseText);    
这句有问题,data参数已经是json对象了,不需要再声明jsonData,而且生成json对象时eval,不是unescape


            $.each( data.value, function(index, item){
                alert(item.regionNameZh); 
                //$("#habitatRegion2").append("<option value='"+item.id+"'>"+item.regionNameZh+"</option>");
            });    



{"success":true,"value":[{"id":"2","regionType":"1","regionNameZh":"北京市","regionParentId":"3525"}] "}

这里多了一个",不知道是不是手误打上去的

前辈,我按照你的方法改了,我的java方法返回值是String,我在return jsonStr之前还out.write(jsonStr)
  $each  data时也改成data.value,并且在$each之前我alert一下data,弹出的是[object XMLHttpRequest],但是确认后,下拉菜单没有添加成功,报错为:length为空或不是对象  jquery.min.js 32行

#8


success的data参数不可能是XMLHttpRequest对象啊,要么字符串,要么就jquery处理后的json对象

直接浏览器访问../region/region!loadNext.do输出的内容是什么?是修改好后的json格式的字符串数据没有?

#9


引用 8 楼 showbo 的回复:
success的data参数不可能是XMLHttpRequest对象啊,要么字符串,要么就jquery处理后的json对象

直接浏览器访问../region/region!loadNext.do输出的内容是什么?是修改好后的json格式的字符串数据没有?

直接访问,打印的就是{"success":true,"value":[{"id":"2","regionType":"1","regionNameZh":"北京市","regionParentId":"3525"}]}这种格式的字符串

#10


那应该木有问题啊,是执行到success回调了吧,那么success:function( data),data参数不会是ajax对象的

楼主什么版本的jquery?

#11


重新梳理一下:
java代码(json格式进行了修改。去掉了succes:true,value:):
public String loadNext()
    {
        if (region == null)
        {
            region = new Region();
            region.setRegionType(1);
            //region.setParentId(0);
        }
        regions = regionServiceImpl.getNextList(region);
        StringBuffer sb = new StringBuffer();
        sb.append("[");
        if (regions.size() > 0)
        {
            int size = regions.size();
            int count = 0;
            for (Region region : regions)
            {
                count++;
                if (region.getPassed() == 0)
                {
                    sb.append("{");
                    sb.append("\"id\":\"" + region.getId() + "\",");
                    sb.append("\"regionType\":\"" + region.getRegionType() + "\",");
                    sb.append("\"regionNameZh\":\"" + region.getRegionNameZh()
                            + "\",");
                    sb.append("\"regionParentId\":\"" + region.getParentId());
                    sb.append("\"}");
                    if (size != count)
                    {
                        sb.append(",");
                    }
                }
            }
        }
        sb.append("]");
        regionStr = sb.toString();
        response.setCharacterEncoding("utf-8");
        PrintWriter out = null;
        try
        {
            out = response.getWriter();
            out.print(regionStr);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            out.flush();
            out.close();
        }
        return null;
    }

struts.xml配置
	<package name="region" extends="struts-default">
<action name="region_*" class="com.beyondsoft.esite.action.region.RegionAction" method="{1}">

</action>
</package>

jsp页面代码:

$.ajax({
type : "POST",
url : "../region/region!loadNext.do",
dataType : "json",
success : function(data) {
$("#habitatRegion2").empty();
$("#habitatRegion2").append("<option value=''>--请选择--</option>");
alert(data) //弹出是 object XMLHttpRequest
$.each(data.value, function(i, item){ //在这里就报错:length为空或不是对象
alert(item.regionNameZh);
$("#habitatRegion2").append("<option value='"+item.id+"'>"+item.regionNameZh+"</option>");
});
}
});

#12


本帖最后由 showbo 于 2013-07-17 09:40:12 编辑
去掉value,$.each就要改了,已经变成数组,

 alert(data) //弹出是 object XMLHttpRequest,success回调函数的参数没见过有传递ajax对象
//如果确实是xhr对象,你的jquery应该是被改动过了。

 alert(data.responseText) //输出看看什么内容

//如果data为xhr,只能eval动态生成json对象了

data=eval('('+data.responseText+')')
 $.each(data, function(i, item){ //在这里就报错:length为空或不是对象
                alert(item.regionNameZh);
                $("#habitatRegion2").append("<option value='"+item.id+"'>"+item.regionNameZh+"</option>");
            });
 

#13


$.post("请求url",function(data){
   $.each(data.Data,function(i,item){
       alert(item.id);
   });
},"json");

#14


是不是忘记添加json.js的引用了

#15


换一种呢

$.ajax({
 ....,
 dataType:'text',
 success:function(data){
   rst_json = eval('('+data+')');
 }
})

#16


success:function(datas)的success和:之间多打了空格。。。是这个原因,我被坑了好久

#17


我也被这个空格问题坑了

#18


{"success":true} 这是我的 返回结果,没空格  也是双引号  可还就总进error  不进success里  到现在 坑了一天了  求解答啊

#19


楼主解决了吗?我现在也被这个问题坑了

#20


有可能是访问跨域问题,API后台需要允许这个

#21