2011-03-13 90 views
53

我无法从JQery.ajax调用中获取JSON对象的内容。我的电话:从JQuery.ajax成功数据解析JSON

$('#Search').click(function() { 
    var query = $('#query').valueOf(); 
    $.ajax({ 
     url: '/Products/Search', 
     type: "POST", 
     data: query, 
     dataType: 'application/json; charset=utf-8', 
     success: function (data) { 
      alert(data); 
      for (var x = 0; x < data.length; x++) { 
       content = data[x].Id; 
       content += "<br>"; 
       content += data[x].Name; 
       content += "<br>"; 
       $(content).appendTo("#ProductList"); 
       // updateListing(data[x]); 
      } 
     } 
    }); 
}); 

看来,JSON对象被返回正确的,因为“警报(数据)”显示以下

[{"Id": "1", "Name": "Shirt"}, {"Id": "2", "Name":"Pants"}] 

但是当我尝试显示编号或名称,页面使用:

content = data[x].Id; 
content += "<br>"; 
content += data[x].Name; 
content += "<br>"; 

它返回“未定义”的页面。我究竟做错了什么?

感谢您的帮助。

+5

文档帮助。 http://api.jquery.com/jQuery.ajax/显示''application/json; charset = utf-8''对于'dataType'不是有效的值。 – 2011-03-13 11:39:50

+0

通过JSON.parse()转换为json – 2017-09-19 01:45:24

回答

78

数据将作为JSON的字符串表示形式返回,并且您不会将其转换回JavaScript对象。将dataType设置为'json'以使其自动转换。

+4

@DipakYadav:'getJSON'不会POST。 – 2013-07-02 09:06:02

+6

@MarceloCantos(关于你的答案):这是真的。然而,根据[jQuery手册](http://api.jquery.com/jQuery.ajax/),“_any格式不正确的JSON被拒绝,并且抛出了一个解析错误。从jQuery 1.9开始,一个空的响应也被拒绝了。 。所以你只能使用'dataType:'json'',如果你确定的话,那个服务器会返回格式化的JSON。如果它只返回“_a字符串,看起来像JSON_”,则应该使用'dataType:“text json”'强制jQuery转换。 – trejder 2013-07-02 09:06:52

+0

header('Content-Type:application/json');如果你使用php – 2016-04-17 16:14:06

2

尝试了jQuery each功能通过您的JSON对象走路:

$.each(data,function(i,j){ 
    content ='<span>'+j[i].Id+'<br />'+j[i].Name+'<br /></span>'; 
    $('#ProductList').append(content); 
}); 
5

嗯...你对那里的3/4处......你已经有了你的JSON文本。

问题是,您似乎正在处理此字符串,就好像它已经是一个JavaScript对象,其中包含与传输字段相关的属性。

它不是......它只是一个字符串。

查询“content = data [x] .Id;”必然会失败,因为JavaScript没有发现这些属性附加到它正在查看的字符串......再次,它只是一个字符串。

您应该能够简单地将数据解析为JSON,通过... yup ... JSON对象的解析方法。

myResult = JSON.parse(request.responseText); 

现在myResult是一个JavaScript对象,它包含通过AJAX传输的属性。

这应该允许您按照您尝试显示的方式处理它。

看起来像添加ECMA5时添加了JSON.parse,所以任何相当现代的东西都应该能够处理这个本地化......如果您必须处理化石,您还可以尝试使用外部库来处理这个问题,如jQueryJSON2

对于此记录,Andy E已经为其他人回答了这个问题HERE

编辑 - 锯的官方或可靠的消息来源“的要求,可能是我找到编码器的一个最可信的是约翰Resig的〜ECMA5 JSON〜我会链接到关于本地JSON实际ECMA5规范支持,但我宁愿将某人介绍给像Resig这样的大师,而不是干规范。

51

我建议你使用:

var returnedData = JSON.parse(response); 

的JSON字符串转换(如果它只是文字)为JavaScript对象。

+1

@RyanGates我相信,abobreshov正在谈论简单的'成功:函数(数据){数据= JSON.parse(数据);}',如果我没有弄错。 – trejder 2013-07-02 08:54:16

+0

当然,我的意思是 – abobreshov 2013-07-02 17:38:35

3

您可以使用jQuery的parseJSON方法:

var Data = $.parseJSON(response); 
6

一个可以保证的方式,这种类型的错误(使用字符串,而不是JSON)不会发生的是看什么获取印刷alert。当你做

alert(data) 

如果数据是一个字符串,它会打印的一切,是包含。但是如果你打印的是json对象。你会得到警告

[object Object] 

以下响应如果响应,那么你可以肯定的是,你可以(在这种情况下JSON)以此为目标。

因此,你需要将字符串转换成JSON第一,用它做这个之前:

JSON.parse(data) 
0

从jQuery API:与dataType设置,如果没有指定,jQuery将尝试基于MIME类型(响应JSON的MIME类型为“application/json”)的$.parseJSON()(在1.4 JSON中将生成JavaScript对象)推断它。您可以将dataType设置为json将其自动转换。

0

我不确定你的设置出了什么问题。也许服务器没有正确设置标题。不确定。作为一个长镜头,你可以试试这个

$.ajax({ 
    url : url, 
    dataType : 'json' 
}) 
.done(function(data, statusText, resObject) { 
    var jsonData = resObject.responseJSON 
}) 
3

这是工作, 例如

.ajax({ 

      url: "http://localhost:11141/Search/BasicSearchContent?ContentTitle=" + "تهران", 
      type: 'GET', 
      cache: false, 
      success: function (result) { 

       // alert(jQuery.dataType); 
       if (result) { 
        // var dd = JSON.parse(result); 
        alert(result[0].Id) 
       } 

      }, 
      error: function() { 
       alert("No"); 
      } 
     }); 

最后,你需要使用本声明

result[0].Whatever