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的序列化与反序列化