我不知道,因爲我沒有在任何地方找到它Newtonsoft JSON.NET兼容性?使用JSON Web服務
換句話說,有沒有辦法讓JSON.NET反序列化webservice的請求的JSON對象,而不是.NET默認的序列化程序?
一種方法可能是聲明WebMethod接受一個純字符串,然後使用JSON.NET的JsonConvert將該原始字符串反序列化爲正確的對象,但這意味着請求的語法(從客戶端)會有點尷尬。
有沒有其他方式或建議這樣做?
感謝,
米奇
我不知道,因爲我沒有在任何地方找到它Newtonsoft JSON.NET兼容性?使用JSON Web服務
換句話說,有沒有辦法讓JSON.NET反序列化webservice的請求的JSON對象,而不是.NET默認的序列化程序?
一種方法可能是聲明WebMethod接受一個純字符串,然後使用JSON.NET的JsonConvert將該原始字符串反序列化爲正確的對象,但這意味着請求的語法(從客戶端)會有點尷尬。
有沒有其他方式或建議這樣做?
感謝,
米奇
據我所知,你必須手動做到這一點,通過使您的網絡服務都有一個字符串作爲參數,並返回一個字符串作爲響應。如果你使用WCF,事情會有很大的不同,因爲與傳統的ASMX Web服務相比,體系結構更具可擴展性,而現在這種服務被認爲是不贊成使用的技術。
用於REST Web服務的新WCF Web API提供了一種使用Json.NET作爲序列化程序的方法。
非常好,謝謝! –
我一直在尋找方法來使用JSON.NET處理JSON序列化。我發現的最好方法是通過派生自BehaviorExtensionElement類來創建WCF行爲擴展。在此描述:
http://json.codeplex.com/discussions/209865
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Web;
using System.ServiceModel.Configuration;
using System.ServiceModel.Dispatcher;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public class JsonNetBehaviorExtension : BehaviorExtensionElement
{
public class JsonNetBehavior : WebHttpBehavior
{
internal class MessageFormatter : IDispatchMessageFormatter
{
JsonSerializer serializer = null;
internal MessageFormatter()
{
serializer = new JsonSerializer();
}
public void DeserializeRequest(Message message, object[] parameters)
{
throw new NotImplementedException();
}
public Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
{
var stream = new MemoryStream();
var streamWriter = new StreamWriter(stream, Encoding.UTF8);
var jtw = new JsonTextWriter(streamWriter);
serializer.Serialize(jtw, result);
jtw.Flush();
stream.Seek(0, SeekOrigin.Begin);
return WebOperationContext.Current.CreateStreamResponse(stream, "application/json");
}
}
protected override IDispatchMessageFormatter GetReplyDispatchFormatter(OperationDescription operationDescription, ServiceEndpoint endpoint)
{
return new MessageFormatter();
}
}
public JsonNetBehaviorExtension() { }
public override Type BehaviorType
{
get
{
return typeof(JsonNetBehavior);
}
}
protected override object CreateBehavior()
{
var behavior = new JsonNetBehavior();
behavior.DefaultBodyStyle = WebMessageBodyStyle.WrappedRequest;
behavior.DefaultOutgoingResponseFormat = WebMessageFormat.Json;
behavior.AutomaticFormatSelectionEnabled = false;
return behavior;
}
}
然後在你的web.config
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="webHttpJson" type="YourNamespace.JsonNetBehaviorExtension, YourAssembly"/>
</behaviorExtensions>
</extensions>
<behaviors>
<endpointBehaviors>
<behavior name="NewtonsoftJsonBehavior">
<webHttp helpEnabled="true" automaticFormatSelectionEnabled="true"/>
<webHttpJson/>
</behavior>
</endpointBehaviors>
<behaviors>
讓我們假設我會使用,而不是傳統的Web服務WCF,纔有可能配置自定義序列化程序和使用json.net而不是.net的默認序列化程序? –
@Mikey S.,當然,順便說一下WCF不使用['JavaScriptSerializer'](http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer。 aspx),但是['DataContractJsonSerializer'](http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.json.datacontractjsonserializer.aspx)。所有你需要的是寫一個[自定義消息格式化程序](http://stackoverflow.com/questions/3118504/how-to-set-json-net-as-the-default-serializer-for-wcf-rest-service/3131413#3131413)。 –
非常感謝,有關WCF的一些很好的教程/書籍,以及有關此主題的具體內容? –