【问题标题】:Unable to parse JSON returned by JQuery ajax call无法解析 JQuery ajax 调用返回的 JSON
【发布时间】: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 很有趣,这是我刚刚在stackoverflow.com/questions/19116385/… 发布的内容:)

标签: c# jquery asp.net ajax json


【解决方案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);
                });
        

        【讨论】:

          猜你喜欢
          • 2012-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多