【问题标题】:Newtonsoft JSON.NET compatibility with Json web servicesNewtonsoft JSON.NET 与 Json Web 服务的兼容性
【发布时间】:2011-10-02 05:54:24
【问题描述】:

我想知道,因为我在任何地方都没有找到它-

可以将基于 Json 的 Web 服务与 Json.NET 库结合使用吗?

换句话说,有没有办法让 JSON.NET 反序列化 webservice 的请求的 JSON 对象,而不是 .NET 默认的 Serializer?

一种方法可能是声明 WebMethod 接受纯字符串,然后使用 JSON.NET 的 JsonConvert 将原始字符串反序列化为正确的对象,但这意味着请求的语法(来自客户端)会有点尴尬。

还有其他方法或建议吗?

谢谢,

米奇

【问题讨论】:

    标签: c# jquery .net web-services json.net


    【解决方案1】:

    AFAIK,您必须手动执行此操作,让您的 Web 服务将字符串作为参数并返回字符串作为响应。如果您使用 WCF,情况就会大不相同,因为与经典的 ASMX Web 服务相比,该架构具有更大的可扩展性,顺便说一下,后者现在被视为已弃用的技术。

    【讨论】:

    • 假设我将使用 WCF 而不是经典的 Web 服务,是否可以配置自定义序列化程序并使用 json.net 而不是 .net 的默认序列化程序?
    • @Mikey S.,当然,顺便说一下,WCF 默认不使用JavaScriptSerializer,而是使用DataContractJsonSerializer。您只需要写一个custom message formatter
    • 非常感谢,有没有关于 WCF 的一般教程/书籍,特别是关于这个主题的?
    【解决方案2】:

    我一直在寻找使用 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>
    

    【讨论】:

      【解决方案3】:

      用于 REST Web 服务的新 WCF Web API 提供了一种使用 Json.NET 作为序列化程序的方法。

      http://blogs.clariusconsulting.net/kzu/using-json-net-for-text-and-binary-json-payloads-with-wcf-webapi/

      【讨论】:

        猜你喜欢
        • 2018-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多