【问题标题】:Issue with JSON and jQueryJSON 和 jQuery 的问题
【发布时间】:2010-04-13 19:46:28
【问题描述】:

我正在调用 Web 服务并以 JSON 格式返回以下数据:

[{"OrderNumber":"12345","CustomerId":"555"}]

在我的网络服务成功方法中,我试图解析两者:

$.ajax({
    type: "POST",
    url: "MyService.asmx/ServiceName",
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
        var data = msg.d;
        var rtn = "";

        $.each(data, function(list) {
            rtn = rtn + this.OrderNumber + ", " + this.CustomerId + "<br/>";
        });

        rtn = rtn + "<br/>" + data;

        $("#test").html(rtn);
        }
    });

但我得到了一堆“未定义,未定义”的行,后跟正确的 JSON 字符串。知道为什么吗?我已经尝试使用 eval() 方法,但这并没有帮助,因为我收到了一些错误消息,说预期会出现 ']'。

【问题讨论】:

  • 我已经删除了部分响应,因为它返回的记录数组的字段比我上面列出的要多。
  • 如果我运行以下命令而不是 var data = msg.d: var data = eval("(" + msg + ")");我明白了: Line: 21 Error: Expected ']'
  • 如果你使用你目前所拥有的但使用var data = msg;(取出.d)会发生什么?
  • 如果我这样做,我只会得到一个 undefined。
  • @Jayson N. Gaylord:eval("(" + msg + ")"); 将把msg 变成一个字符串(因为你要连接它),然后评估结果。因为msg 是一个对象,所以var a = "(" + msg + ")" 将为您提供a 的以下值:"([object Object])"。所以实际上,你正在做eval("([object Object])"),这显然是行不通的。只是为了澄清一下=)我相信我已经在我的其他 cmets 中说了关于此事的所有其他内容。

标签: jquery web-services json serialization


【解决方案1】:

当您执行each() 时,您可能会得到所有正确的值。但紧接着,您将data(即整个响应对象(res.d.))连接到字符串中。我不明白这怎么可能是你想要的。复杂的对象(例如可以使用 $.each() 迭代的对象)很少可以通过简单地将它们连接到现有字符串中来合理地用字符串表示。所以这应该会导致你的一些虚假数据。

除此之外,我认为当您尝试评估这些值时遇到错误是相当令人不安的。我认为您永远不需要求助于eval 解决方案,但是,您绝对应该能够 访问eval 您的数据。如果你不能,那么你的回复中有一些严重错误的东西。如果eval(myVar) 说它期待],那么您需要提醒myVar 并告诉我们它的全部价值。

【讨论】:

  • 这是我当前响应的值:[{"StreetAddress1":"123 Main St","BusinessName":"ABC Inc","OrderNumber":"987654"},{"StreetAddress1" :"75 Main St","BusinessName":"Google","OrderNumber":"654321"},{"StreetAddress1":"27 Main St","BusinessName":"Microsoft","OrderNumber":"123456" }] 这是使用 ASP.NET 3.5 的 JavaScriptSerializer().Serialize() 方法呈现的。
  • 我同意这一行 rtn = rtn + "
    " + data;有点奇怪。
  • @Jayson N. Gaylord:这里有几件事让我感到不安。首先,如果我eval 是一个带有您发布的值的字符串,我没有收到您描述的错误,所以某些时候某些东西没有您认为它具有的值。其次,您是否手动调用JavaScriptSerializer?因为如果它是一个网络方法,正如我所期望的那样,你想要做的是返回一个 .NET 对象,.NET 会自动序列化它(但也许这就是你的意思)
  • 我确实最终使用了 eval,但在 msg.d 上而不是在 msg 上。
【解决方案2】:

我可能错了,但会是这样吗:

 rtn = rtn + list.OrderNumber + ", " + list.CustomerId + "<br/>";

HTH

【讨论】:

    【解决方案3】:

    不确定我是否遗漏了什么,但如果你提醒 msg.d 是未定义的值?我认为成功回调的第一个参数是数据本身。所以它可能只是......

    msg.OrderNumber + ", ", + msg.CustomerId;
    

    如果它是一个数组,那么它就像 Raja 的答案。

    $.each(data, function(list, item) {
        rtn = rtn + item.OrderNumber + ", " + item.CustomerId + "<br/>";
    });
    

    【讨论】:

    • 当我发出警报时,它会显示正确的 JSON 字符串。此外,它是一个数组。我已经像 Raja 提到的那样切换了它,但它没有帮助(还)。
    • 您是否也尝试过在 $.each 回调中使用第二个参数?第一个是索引,第二个是值。见我上面的编辑......
    • 我得到 OrderNumber 为空或不是对象。
    • 这是我当前 JSON 响应的值:[{"StreetAddress1":"123 Main St","BusinessName":"ABC Inc","OrderNumber":"987654"},{"StreetAddress1 ":"75 Main St","BusinessName":"Google","OrderNumber":"654321"},{"StreetAddress1":"27 Main St","BusinessName":"Microsoft","OrderNumber":"123456 "}]
    【解决方案4】:

    假设您将输入用作

    [{"StreetAddress1":"123 Main St","BusinessName":"ABC Inc","OrderNumber":"987654"},{"StreetAddress1":"75 Main St","BusinessName":"Google ","OrderNumber":"654321"},{"StreetAddress1":"27 Main St","BusinessName":"Microsoft","OrderNumber":"123456"}]

    1. 应该使用eval(msg)。不知道你为什么使用 msg.d
    2. this.CustomerID 将返回 undefined,因为 JSON 响应中没有 customerID

    【讨论】:

    • 那是因为我更改了数组以消除 customerID 信息和其他值。我确实将其切换为 eval。
    【解决方案5】:

    我终于通过这样做让它工作了:

    var data = eval('(' + msg.d + ')');
    

    我确信这不是很好,但它确实有效。如果任何人都可以提供这个工作的原因和/或我的问题的解决方案,我仍然会很感激。 :)

    【讨论】:

    • 如果可行,但不是data = msg.d,那么msg.d 是字符串而不是对象。通过alert(typeof msg.d) 验证这一点。如果这提醒string 而不是object 它解释了一切。在这种情况下,我会冒险您在服务器端做错了什么(是的,与我最近对我自己的回答的评论中的猜测相同)。我猜你的 webmethod 看起来像这样public string Abc() { ... return JavaScriptSerializer.Serialize(myObject); },相反,如果你把它改成public object Abc() { ... return myObject; },你的msg.d 应该是一个javascript 对象而不是一个字符串。
    • 这是有道理的大卫。我认为您在返回对象时确实必须序列化它?
    • 不,如果您将其作为对象返回,它将自动序列化。 (并且在服务器端自动反序列化)。这就是为什么您所做的最终会导致对象序列化两次,因此当您收到 msg.d 时自动反序列化(一次)它仍然是一个字符串 =)
    【解决方案6】:

    这太讽刺了。前段时间我遇到了类似的问题...这对我来说很有效。

    function BuildTable(msg) {
     var table = '<table><thead><tr><th>First Name</th><th>Middle Name</th><th>Last       Name</th></thead><tbody>';
    for (var i = 0, l = msg.length; i < l; i++)
    {
      var person = msg[i];
      var row = '<tr>';
      row += '<td>' + person.FirstName + '</td>';
      row += '<td>' + person.MiddleName + '</td>';
      row += '<td>' + person.LastName + '</td>';
      row += '</tr>';
      table += row;
    }
    table += '</tbody></table>';
    $('#Container').html(table);
    }
    

    link text

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多