从ASMX web服务返回Json数据

我需要从C#Web服务获取Json数据。

我知道有几个基于此的问题,请相信我,我已经阅读了很多,但只是进一步迷惑了我。

这是我所做的:

在我的Web服务,我已经包括: [System.Web.Script.Services.ScriptService]类和[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]的方法

我也使用JavaScriptSerializer()将我的数据转换为string

我使用$.getJSON()调用这个服务

如果我不使用,我得到一个跨域参考错误。

要做到这一点,我不得不设置m服务来获取callback函数的名称,所以我通过t his.Context.Request["callback"] +序列化的Json数据;

但在输出中,我把它包裹起来

 < string xmlns="http://XYZ..."> 

标签内的数据是我需要的格式

我也尝试使用设置内容types: $.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});

但仍然没有成功。

稍后添加:我接受了frenchie的anwser,因为我知道这是正确的方法,但我仍然没有得到它的工作…我只是把web服务和网站在同一个域和使用XML,我知道这不是最好的方式,但是我花了2天时间,不能浪费更多。

用这个:

 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); } } 

如果您不使用自定义转换器,那么jsonstring和服务器端对象的c#类定义之间的属性必须匹配才能使反序列化工作。 对于序列化,如果你没有自定义转换器,jsonstring将包含你的c#类的每个属性。 您可以在c#类中的属性定义之前添加[ScriptIgnore] ,如果不指定自定义转换器,该属性将被序列化程序忽略。