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

Posted

技术标签:

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

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

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

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

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

还有其他方法或建议吗?

谢谢,

米奇

【问题讨论】:

【参考方案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/

【讨论】:

以上是关于Newtonsoft JSON.NET 与 Json Web 服务的兼容性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用与 NewtonSoft (JSON.Net) 组件中的 JSON 匹配的 Swift 类从/向 JSON 读取/写入对象数组?

一:Newtonsoft.Json 支持序列化与反序列化的.net 对象类型;

使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON.net 的json的序列化与反序列化

无法访问 Newtonsoft.JSON .Net Core 2.* 方法

Newtonsoft.Json(Json.net) 的使用

Newtonsoft.Json(Json.Net)学习笔记