2011-07-10 121 views
4

我不知道,因爲我沒有在任何地方找到它Newtonsoft JSON.NET兼容性?使用JSON Web服務

換句話說,有沒有辦法讓JSON.NET反序列化webservice的請求的JSON對象,而不是.NET默認的序列化程序?

一種方法可能是聲明WebMethod接受一個純字符串,然後使用JSON.NET的JsonConvert將該原始字符串反序列化爲正確的對象,但這意味着請求的語法(從客戶端)會有點尷尬。

有沒有其他方式或建議這樣做?

感謝,

米奇

回答

3

據我所知,你必須手動做到這一點,通過使您的網絡服務都有一個字符串作爲參數,並返回一個字符串作爲響應。如果你使用WCF,事情會有很大的不同,因爲與傳統的ASMX Web服務相比,體系結構更具可擴展性,而現在這種服務被認爲是不贊成使用的技術。

+0

讓我們假設我會使用,而不是傳統的Web服務WCF,纔有可能配置自定義序列化程序和使用json.net而不是.net的默認序列化程序? –

+0

@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)。 –

+0

非常感謝,有關WCF的一些很好的教程/書籍,以及有關此主題的具體內容? –

3

我一直在尋找方法來使用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>