从ASMX Web服务返回JSON,没有XML包装器?

Pra*_*eta 6 json web-services asmx javascriptserializer

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

我知道基于此有几个问题,请相信我,我已阅读了不少内容,但只是为了让我更加困惑.

这就是我所做的:

在我的网络服务中,我包括:[System.Web.Script.Services.ScriptService]用于课程和[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]方法

我还用a JavaScriptSerializer()来将我的数据转换为字符串

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

如果我不使用它,我会收到跨域引用错误.

为此,我不得不设置m服务来获取回调函数名称,所以我传递t his.Context.Request["callback"]+序列化的Json数据;

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

< string xmlns="http://XYZ...">  
Run Code Online (Sandbox Code Playgroud)

标签内的数据采用我需要的格式

我还尝试使用以下方法设置内容类型 $.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});

但仍然没有成功.

稍后添加:我接受了frenchie的anwser,因为我知道这是正确的方法,但我仍然不能让它工作......我只是将webservice和网站放在同一个域并使用xml,我知道这不是最好的方法,但是我花了两天时间而且不能浪费更多.

fre*_*hie 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    
}
Run Code Online (Sandbox Code Playgroud)

然后在服务器端,在 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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