【问题标题】:Return JSON from ASMX web service, without XML wrapper?从 ASMX Web 服务返回 JSON,没有 XML 包装器?
【发布时间】:2011-12-06 19:15:56
【问题描述】:

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

我知道有几个基于此的问题,相信我,我已经阅读了很多,但只会让我更加困惑。

这就是我所做的:

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

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

我正在使用 $.getJSON() 调用此服务

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

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

但在输出中我把它包裹在

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

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

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

但还是没有成功。

稍后添加:我接受了 frenchie 的 anwser,因为我知道这是正确的方法,但我仍然无法让它工作......我只是将 web 服务和网站放在同一个域中并使用了 xml,我知道这不是最好的方法,但我已经花了 2 天时间,不能再浪费了。

【问题讨论】:

  • 您使用的是 WCF、ASMX 吗?您也可以使用 ASP .NET MVC 轻松返回 JSON 数据。
  • 您是否考虑使用 RESTful 服务?在这种情况下,这可能对您更有效。
  • 我正在使用 ASMX... 对 C# Web 服务非常陌生...我通常使用 PHP 并且它很容易完成。
  • ASMX 是旧的遗留技术,不应该用于新的开发。您应该改用 WCF。
  • @Zoidberg: 你能不能给我一些指示restful...我相信我正在使用它..

标签: json web-services asmx javascriptserializer


【解决方案1】:

使用这个:

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],如果您不指定自定义转换器,序列化程序将忽略该属性。

【讨论】:

  • 我需要在发送前使用 JavaScriptSerializer() 对数据进行序列化还是直接发送数据?
  • 是的,你需要序列化它。您可以使用直接序列化或使用自定义序列化程序。更新代码。
  • 刚刚更新了代码。这是我使用的逐字记录,并且有效。让我知道这是否有帮助。
  • 我是这样做的:JavaScriptSerializer js = new JavaScriptSerializer();字符串 strJSON = js.Serialize(locs); locs 是一个对象数组。这是一种可以接受的方式吗?
  • 是的,如果你有一个对象数组,序列化器就能很好地完成这项工作。我真的建议使用自定义转换器,因为当您为 Web 序列化对象时,您拥有的属性名称可以缩短。你的东西工作了吗?
猜你喜欢
  • 2012-06-20
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2020-06-02
  • 2011-02-14
  • 1970-01-01
相关资源
最近更新 更多