从ASMX web服务返回JSON,不带XML包装器?

6
我需要从一个C# Web服务中获取Json数据。
我知道有几个问题是基于此的,相信我,我已经阅读了很多,但只是更加困惑。这是我所做的:
在我的Web服务中,我包含了:class的[System.Web.Script.Services.ScriptService] 和 method 的[ScriptMethod(ResponseFormat = ResponseFormat.Json,UseHttpGet = true)]
我还使用JavaScriptSerializer()将我的数据转换为字符串
我使用$ .getJSON()调用此服务
如果我不使用它,我会得到一个跨域引用错误。
为了做到这一点,我必须设置我的服务以获取回调函数名,因此我正在传递t his.Context.Request [“callback”] +序列化的Json Data;
但在输出中,我发现它被包装在中
< string xmlns="http://XYZ...">  

标签内的数据格式符合我的需求。

我也尝试使用以下方式设置内容类型:$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});,但仍然没有成功。

后来添加:我接受了frenchie的答案,因为我知道这是正确的方法,但我仍然无法使其工作...我只是将webservice和网站放在同一个域中,并使用xml,我知道这不是最好的方法,但我已经花费了两天时间,不能再浪费更多时间。


你考虑过使用RESTful服务吗?在这种情况下,那可能会更适合你。 - Zoidberg
@Praneeta 请看这个链接http://ajaxpatterns.org/RESTful_Service它应该给你足够的信息来开始。 - Zoidberg
@Praneeta 这篇文章介绍了如何使用JSON实现RESTful服务 http://bitworking.org/news/restful_json - Zoidberg
它基本上使用HTTP协议进行调用。发送JSON post也很容易,所以一切都是非常开放的。 - Zoidberg
可能是重复的问题:Asmx Web服务如何返回没有XML包装器的JSON? - Stephen Kennedy
显示剩余4条评论
1个回答

4
请使用以下内容:
var JsonString = ....;
$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "YourWebServiceName.asmx/yourmethodname",
    data: "{'TheData':'" + JsonString + "'}",
    dataType: "json",
    success: function (msg) {
        var data = msg.hasOwnProperty("d") ? msg.d : msg;
        OnSucessCallBack(data);
    },
    error: function (xhr, status, error) {
        alert(xhr.statusText);
    }
});

function OnSuccessCallData(DataFromServer) {
 // your handler for success    
}

然后在服务器端,在自动生成的AppCode文件夹中的代码后台文件中,你可以编写类似于以下的内容:

using System.Web.Services;
using System.Web.Script.Serialization;

    [System.Web.Script.Services.ScriptService]
    public class YourWebServiceName : System.Web.Services.WebService
    {
        [WebMethod]
        public string yourmethodname(string TheData)
        {
          JavascriptSerializer YourSerializer = new JavascriptSerializer();
          // custom serializer if you need one 
          YourSerializer.RegisterConverters(new JavascriptConverter  [] { new YourCustomConverter() });

          //deserialization
          TheData.Deserialize(TheData);

          //serialization  
          TheData.Serialize(TheData);
        }
    }

如果您不使用自定义转换器,那么json字符串和服务器端对象的c#类定义之间的属性必须匹配才能进行反序列化。对于序列化而言,如果您没有自定义转换器,json字符串将包括您c#类的每个属性。您可以在c#类的属性定义之前添加[ScriptIgnore],如果您没有指定自定义转换器,则该属性将被序列化器忽略。


抱歉提出旧问题,但我似乎遇到了同样的问题,而且我不太明白你到底在做什么。我所做的就是调用 .Serialize(tasks); 其中 tasks 是自定义对象列表。据我所知,这应该返回一个 JSON 对象数组。但我的网页得到的是嵌入在 XML 中的 JSON 对象数组。我使用 ASMX,因为我正在更新一家传统公司的内部网站,以包括特定功能,以匹配使用 MVC 的即将推出的内部网站。有什么想法吗? - PrinceTyke
如果返回的是XML,那是因为页面发送的请求没有正确指定返回格式。请确保像答案中一样指定contentType和dataType。 - frenchie
我最初使用的是$.post,但我改用$.ajax来看会发生什么。在我的MVC方法中,我会得到一个JSON对象数组,像这样:"[{"id":1006,"system":1,...},{"id":1007,"system":1, ...}]",但是使用$.ajax,我会得到一个包含数组的对象,我想是这样的:{"d":[{"__type":"TaskManagement.Task","id":1006,...},{"__type" :"TaskManagement.Task","id":1007,...}]}。你能帮我使用这个或者得到类似于另一个响应吗? - PrinceTyke
没关系,我已经明白怎么做了。我只需要好好思考一下JSON对象的工作方式就可以了。在我的函数(r)中,我只需要引用r.d来获取数组,即r.d[i].id。不过还是感谢您的帮助! - PrinceTyke
不,您不需要手动序列化。当正确设置时,框架将检测您是否请求XML或JSON,并将启动必要的序列化程序。您不应返回json字符串,也不应返回void并破解响应 - 只需返回自然类型,如果您没有针对JSON,则函数将返回该类型。 https://dev59.com/wG7Xa4cB1Zd3GeqPr6HO#16335022 - Stephen Kennedy
显示剩余15条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接