读取从ASMX返回的JSON数据

时间:2011-03-09 15:37:41

标签: c# jquery json asmx

我编写了一个看起来像这样的ASMX服务;

namespace AtomicService
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [ScriptService]
    public class Validation : WebService
    {
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string IsEmailValid(string email)
        {
            Dictionary<string, string> response = new Dictionary<string, string>();
            response.Add("Response", AtomicCore.Validation.CheckEmail(email).ToString());
            return JsonConvert.SerializeObject(response, Formatting.Indented);
        }
    }
}

我正在使用Newtonsoft.Json库来提供JsonConvert.SerializeObject功能。当在Fiddler中调用或通过我的Jquery访问时,我收到此响应: as seen in google chrome in this case

此警报的代码为:

$(document).ready(function () {
            $.ajax({
                type: "POST",
                url: "http://127.0.0.1/AtomicService/Validation.asmx/IsEmailValid",
                data: "{'email':'dooburt@gmail.com'}",
                contentType: "application/json",
                dataType: "json",
                success: function (msg) {
                    if (msg["d"].length > 0) {
                        alert("fish");
                    }
                    alert("success: " + msg.d);
                },
                error: function (msg) {
                    alert("error");
                }
            });
        });

虽然我可以查看来自msg.d的数据,但我无法访问它。我想知道Response是什么。我怎么能得到它?

我并不完全相信我的ASMX正在为所有工作返回正确类型的JSON。

有人可以帮忙吗? :)

2 个答案:

答案 0 :(得分:5)

@ rsp的答案在技术上是正确的,但真正的问题是你在asmx页面中对你的值进行了双重编码。

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] //This will cause the response to be in JSON
    public Dictionary<string, string> IsEmailValid(string email)
    {
        Dictionary<string, string> response = new Dictionary<string, string>();
        response.Add("Response", AtomicCore.Validation.CheckEmail(email).ToString());
        return response; //Trust ASP.NET to do the formatting here
    }

然后您不需要在JavaScript中进行双重解码。

答案 1 :(得分:4)

您的反序列化JSON对象似乎有另一个JSON作为其值之一。尝试添加:

var data = $.parseJSON(msg.d);
alert(data.Response);

成功回调,看看是否属实。

更新:如果是这种情况,那么您对数据进行了两次JSON编码 - 请参阅the answer by C. Ross以获得正确的解决方案。