我需要从C#Web服务获取Json数据。
我知道有一些基于此的问题,相信我,我已经阅读了很多,但只是让我进一步困惑。
这是我所做的:
在我的Web服务中,我包括了:[System.Web.Script.Services.ScriptService]用于类和[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]方法
[System.Web.Script.Services.ScriptService]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
我还使用了a JavaScriptSerializer()将我的数据转换为字符串
JavaScriptSerializer()
我正在使用此服务致电 $.getJSON()
$.getJSON()
如果我不使用它,则会收到跨域引用错误。
为此,我必须设置m服务以获取回调函数名称,以便传递t his.Context.Request["callback"]+序列化的Json Data;
his.Context.Request["callback"]
但是在输出中我把它包裹起来
< string xmlns="http://XYZ...">
标签中的数据采用我需要的格式
我也尝试使用设置内容类型: $.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});
$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});
但是仍然没有成功。
稍后添加:我接受了Frenchie的答案,因为我知道这是正确的方法,但是我仍然无法使它正常工作…我只是将webservice和网站放在相同的域中,并使用了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); } }
如果不使用自定义转换器,则服务器端对象的json字符串和c#类定义之间的属性必须匹配,才能进行反序列化。对于序列化,如果没有自定义转换器,则json字符串将包含c#类的每个属性。您可以[ScriptIgnore]在c#类中的属性定义之前添加,如果不指定自定义转换器,则序列化程序将忽略该属性。
[ScriptIgnore]