我想用JSON.NET替换默认的WCF JSON(对于所有数据类型)序列化。我在网上搜索了所有内容,却找不到有效的解决方案。
这是我的对象:
[JsonObject]
public class TestObject
{
[JsonProperty("JsonNetName")]
public string Name = "John";
[JsonProperty]
public DateTime Date = DateTime.Now;
}
这是我的WCF函数:
[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
List<TestObject> Get();
这是Global.asax中的代码:
protected void Application_Start(object sender, EventArgs e)
{
// Create Json.Net formatter serializing DateTime using the ISO 8601 format
var serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new IsoDateTimeConverter());
serializerSettings.Converters.Add(new BinaryConverter());
serializerSettings.Converters.Add(new JavaScriptDateTimeConverter());
serializerSettings.Converters.Add(new BinaryConverter());
serializerSettings.Converters.Add(new StringEnumConverter());
var config = HttpHostConfiguration.Create().Configuration;
Microsoft.ApplicationServer.Http.JsonMediaTypeFormatter jsonFormatter = config.OperationHandlerFactory.Formatters.JsonFormatter;
config.OperationHandlerFactory.Formatters.Remove(jsonFormatter);
config.OperationHandlerFactory.Formatters.Insert(0, new JsonNetMediaTypeFormatter(serializerSettings));
var httpServiceFactory = new HttpServiceHostFactory
{
OperationHandlerFactory = config.OperationHandlerFactory,
MessageHandlerFactory = config.MessageHandlerFactory
};
//Routing
RouteTable.Routes.Add(
new ServiceRoute(
"Brands", httpServiceFactory,
typeof(Brands)));
}
这是Web.Config:
<endpointBehaviors>
<behavior name="Behavior_Brands">
<webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Bare" />
</behavior>
</endpointBehaviors>
和服务部分:
<service name="TestApp.CoreWCF.Brands">
<endpoint address="" behaviorConfiguration="Behavior_Brands" binding="webHttpBinding" contract="TestApp.CoreWCF.IBrands">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</service>
最后,这是启动URL时得到的:
“ http:// localhost:30000 / Brands / Get
”
[{"Date":"\/Date(1354364412708+0200)\/","Name":"John"}, {"Date":"\/Date(1354364412708+0200)\/","Name":"John"}]
JSON答案显然会忽略JSON.NET属性。
无论如何,我想出了一种手动使用其他序列化器的方法,它似乎更高效,更快捷,因为它不会通过Microsoft的序列化器,尽管从代码角度来看,它有点麻烦。
[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
System.ServiceModel.Channels.Message GetData();
public static System.ServiceModel.Channels.Message GetJsonStream(this object obj)
{
//Serialize JSON.NET
string jsonSerialized = JsonConvert.SerializeObject(obj);
//Create memory stream
MemoryStream memoryStream = new MemoryStream(new UTF8Encoding().GetBytes(jsonSerialized));
//Set position to 0
memoryStream.Position = 0;
//return Message
return WebOperationContext.Current.CreateStreamResponse(memoryStream, "application/json");
}
return yourObject.GetJsonStream();
问题内容: 是否可以替换WCF的默认JSON序列化(我目前正在测试行为),并作为MIME类型传递。特别是,我不喜欢默认情况下每个属性都是键/值对,例如: 我仅将服务用于启用JSON的端点(使用jQuery + WCF请求数据)。 问题答案: 您可以使用消息格式化程序来更改用于处理JSON的序列化程序。https://docs.microsoft.com/zh- cn/archive/blogs/c
问题内容: 我试图在我的中设置全局序列化器设置。 使用以下代码序列化对象时,是否不使用全局序列化程序设置? 是否可以像这样设置全局序列化程序设置,或者我遗漏了什么? 问题答案: 设置成功了。
但是,我发现该模块将使用DefaultJsonSerializer序列化Map和Entry对象(因为它们也是Object对象)。 如何更改默认序列化行为,同时确保条目和映射对象按预期序列化?
问题内容: 序列化/反序列化实体时可以改写默认的WCF DataContractSerializer行为,而改用JSON.NET吗? 我具有以下处理城市实体的服务合同。出于设计原因,City实体的IsReference = true,因此默认的DataContractSerializer引发错误。 对于“ GET”方法,我可以使用JsonConvert.DeserializeObject处理这种情
我有一个类,它用Data合同和Data会员属性进行了注释。一些成员被标记为。当我通过Json的线路序列化实例时。NET,并且所需的对象成员具有空值,然后它们的序列化值在输出中丢失(这显然相当于在JSON中为空)。我没意见。 我创建了一种“echo”服务,它返回作为响应发送给它的数据。因此,此服务接收缺少成员的JSON(或空成员,具体取决于您如何看待它),然后将其发送回我的JSON。NET客户端。通
问题内容: 我有一个将大型JSON对象返回到jQueryFlot的控制器,我想知道用更快的东西(例如ServiceStack.Text中的东西)替换默认JavaScriptSerializer会多么容易。 如果我可以使用DependencyResolver来更改此类内容,那将是很好的选择,但是我想,如果绝对可以解决所有问题,它可能会变得很慢。 问题答案: 最好的选择是从JsonResult类继承并