无法解析 JQuery ajax 调用返回的 JSON

Posted

技术标签:

【中文标题】无法解析 JQuery ajax 调用返回的 JSON【英文标题】:Unable to parse JSON returned by JQuery ajax call 【发布时间】:2013-10-15 19:51:48 【问题描述】:

我正在使用下面给出的 JQuery ajax 调用方法

$.post('../User/GetCountry',
        
            zone: 1
        ,
        function (data) 
            alert(data);
            alert(data["Countries"]);
        , "json").fail(function (jqXHR, textStatus, errorThrown) 
            //alert(textStatus);
        );

C#代码

public static string GetCountry()
    
        var result = new System.Web.Script.Serialization.javascriptSerializer().Serialize(Countries.GetAll());
        return result;
    

现在当我在服务器端调试我的代码时,我看到下面的结果,根据我的说法,这是完美的 json

["Id":4,"Name":"France","Id":3,"Name":"Germany"]

但在 javascript 中,我得到的 json 为

[[object Object],[object Object]]

谁能告诉我我在这里缺少什么

已解决 var jsonData = JSON.stringify(data); var jsonParse = JSON.parse(jsonData);

【问题讨论】:

它只是告诉你这是一个对象数组 :) 这是真的 改用console.log(data)。 alert() 将尝试为您字符串化,这意味着 objecst 将只是 object Object 您正在返回一个对象数组。尝试使用JSON.NET 反序列化数组。这样会容易很多! @icemanind 它已经被反序列化,因此他看到的是 [object Object]。 @RajKumar 很有趣,这是我刚刚在***.com/questions/19116385/… 发布的内容:) 【参考方案1】:

您的代码存在一些问题。首先,尽管您将参数zone 传递给Web 服务方法,但该方法本身不会接收此参数。其次,如果要返回 JSON,请不要使用返回类型字符串。使用JSONResult。这也将允许您删除 static 关键字。我建议像这样更改您的方法:

public JSONResult GetCountry(int? zone)

    // ...

您应该进行两项最终更改。第一种是使用 ASP.Net MVC 内置的Json() 方法来处理对象的序列化。第二个是您应该始终投影您的数据层结果,即使它们碰巧已经在您要使用的结构中。这样,如果您以破坏服务的方式更改数据层对象,您将收到编译错误而不是运行时异常。

return Json(from c in Countries.GetAll() select new  Id = c.Id, Name = c.Name )

我还建议避免使用$.get$.post,因为它们抽象出在访问网络服务时可能有用的设置。如果您想简写它,我建议将 $.ajax 调用包装在您自己的函数中。您还需要考虑标准化您的 Web 服务响应。您的 Web 服务是一种协议,因此它受益于定义良好的标头。更深入的解释请看这里:Introduction to MVC Service Based Web Applications

【讨论】:

我使用的是 asp.net 而不是 MVC【参考方案2】:

试试这个:

alert(data[0].Name)

【讨论】:

【参考方案3】:
$.ajax(
    type: 'POST',
    url: '../User/GetCountry',
    data: 
        zone: 1
    ,
    success: function(data)  alert('data: ' + data); ,
    contentType: "application/json",
    dataType: 'json'
);

对我有好处。您需要确保发送的内容类型为“application/json”,最好使用Controller 中的Json() 辅助方法。

【讨论】:

【参考方案4】:

多搜索后解决了这个问题

$.post('../User/GetCountry',
    
        zone: 1
    ,
    function (data) 
        var jsonData = JSON.stringify(data); 
        var jsonParse = JSON.parse(jsonData);
        , "json").fail(function (jqXHR, textStatus, errorThrown) 
          alert(textStatus);
    );

【讨论】:

【参考方案5】:

尝试使用 JSON.parse():

$.post('../User/GetCountry',
        
            zone: 1
        ,
        function (data) 
            data=JSON.parse(data)

            alert(data["Countries"][0].Name);
        , "json").fail(function (jqXHR, textStatus, errorThrown) 
            //alert(textStatus);
        );

【讨论】:

以上是关于无法解析 JQuery ajax 调用返回的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

无法访问从 ajax 调用返回的对象的属性

jQuery.map() 解析 select2 ajax 调用的结果

无法从 jQuery Ajax 调用中获得正确的返回值 [重复]

Jquery 调用了post后在数据返回前页面无法跳转

无法从 JQuery ajax 调用接收 JSON

jQuery 似乎无法识别具有 Ajax 调用状态码 403 的不同字符串