【问题标题】:Dealing with Data Returned by a Web Method as JSON with jQuery使用 jQuery 处理 Web 方法以 JSON 形式返回的数据
【发布时间】:2012-01-13 17:04:37
【问题描述】:

我在使用 JSON 时遇到了更多问题!

我正在使用这篇文章中的建议http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/

使用它,我设法使用服务器端 Web 方法来执行 AJAX 操作。

在大多数情况下,我只需要它来做一些事情(例如,将事情保存到数据库中)所以不需要对响应做任何事情,但现在我遇到了我这样做的情况,我搞不定!

Web 方法返回一个 JSON 对象,如下所示:

{"d":"[{\"validDetails\":\"True\",\"lateAlert\":\"\",\"LoginResponse\":\"Logging in Jamie at 16:53 please wait\"}]"}

这是 Firebug 显示的输出。我不确定\ 是什么,但请耐心等待...

AJAX 调用并尝试输出此响应是:

$("form").on("submit", function () {
    var LogonObject = new Object;
    LogonObject.password = $('#password').val();
    var LogonData = JSON.stringify(LogonObject);

    $.ajax({
        type: "POST",
        url: "/logIn.aspx/login_try",
        data: LogonData,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            var results = (data.d);
            $('#LoginResponse').html(results); // this is a Div to display the result
        }
    });
});

如果我这样做,那么#LoginResponse DIV 会显示:

[{"validDetails":"True","lateAlert":"","LoginResponse":"Logging in Jamie at 16:53 please wait"}]

在我看来,这就像一个快乐的 JSON 对象!

我不知道如何获得下一个级别。

即,如何获取validDetails、lateAlert等的结果值?

我试过了:

$.each(results, function (index, element) {
    $.each(element, function (index, sub) {
      alert(sub);
     });
});

以及我在 Google 和 SO 上找到的信息的其他几种变体,但它似乎将 results 变量视为字符串,而不是数组,并且我在警报中得到的输出是每个单独的字符,即;

[, {, ", v, a, l, i, d, D... etc

所以我想知道results是否需要再次转换为JSON(虽然我不知道为什么)所以我尝试了

results = $.parseJSON(data.d)

但这也没有用。

我确定我在这里遗漏了一些非常简单的东西,但我不知道该怎么做! :-(

编辑,生成响应的代码(遗漏了大量逻辑,但这是重要的一点):

Public Class OutputObject
    Public validDetails, lateAlert, LoginResponse As String 'content of JSON output'
End Class

<System.Web.Services.WebMethod()> _
Public Shared Function login_try(password As String)

    Dim outputArray As New ArrayList

    Dim Login As New OutputObject()
    Login.validDetails = validDetails
    Login.lateAlert = lateAlert
    Login.LoginResponse = LoginResponse
    outputArray.Add(Login)

    serializer = New JavaScriptSerializer()
    Return serializer.Serialize(outputArray)

end function

【问题讨论】:

  • 我相信错误出现在您的 JSON 序列化中(因为您的 JSON 看起来已经被序列化了两次)。我们能得到执行此操作的代码吗?
  • 与下面建议的答案相同,undefined

标签: jquery asp.net vb.net json webmethod


【解决方案1】:

我相信错误出现在您的 JSON 序列化中(因为您的 JSON 看起来已经被序列化了两次)。我们可以得到执行此操作的代码吗?

【讨论】:

  • 你很可能在这里有所收获。我已经更新了问题。我尝试在返回时跳过序列化,即将Return serializer.Serialize(outputArray) 更改为Return (outputArray),这删除了那些奇怪的` characters I mentioned, but then I got a JS error saying Could not convert JavaScript argument arg 0 [nsIDOMDocumentFragment.appendChild]`
  • 我不知道你的代码哪里出错了,请详细说明,当你不序列化返回值时使用alert(data.d)。
  • 抱歉,当我尝试运行代码时,Firebug 窗口中会出现该错误。我现在试试(data.d),一秒钟……
  • 如果我不序列化 Return,Firebug 显示我得到的响应是 {"d":[{"validDetails":"True","lateAlert":"","LoginResponse":"Logging in Jamie at 17:46 please wait"}]},这对我来说看起来绝对正确,但尝试执行 alert(data.d) 会导致上面的错误萤火虫窗口。这发生在我运行代码后收到返回之后。
  • 知道了!错误是我没有正确处理输出。 success: function (data) { var results = (data.d); var validDetails = results[0].validDetails $('#LoginResponse').html(validDetails); } 工作!你说得对,我连载了两次! :)
【解决方案2】:

alert(sub.validDetails) 会发生什么;

【讨论】:

  • 我在警报中收到undefined,很多次!
  • element.validDetails 怎么样?
  • 从您的 ajax 请求中删除:contentType: "application/json; charset=utf-8"。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 2013-08-02
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多