Newtonsoft JSON.NET与Json Web服务的兼容性

时间:2011-07-10 13:07:44

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

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

基于Json的Web服务可以与Json.NET库一起使用吗?

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

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

还有其他方法或建议吗?

谢谢,

米奇

3 个答案:

答案 0 :(得分:3)

AFAIK,您必须手动执行此操作,方法是让您的Web服务将字符串作为参数并返回字符串作为响应。如果你使用WCF,那么事情会有很大的不同,因为与传统的ASMX Web服务相比,体系结构更具可扩展性,顺便说一下,它现在被认为是一种不推荐使用的技术。

答案 1 :(得分: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>

答案 2 :(得分:2)

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

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