当前位置: 首页 > 面试题库 >

将WCF 4中的默认JSON序列化器替换为JSON.NET

宇文兴言
2023-03-14
问题内容

我想用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的序列化器,尽管从代码角度来看,它有点麻烦。

  1. 在接口和实现它们的类中,将所有返回类型设置为“ System.ServiceModel.Channels.Message”。
        [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    System.ServiceModel.Channels.Message GetData(); 
  1. 创建一个扩展方法,以便您可以使用JSON.NET序列化器(或您要使用的任何一种)轻松地从对象中构建内存流。
        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");
    }
  1. 在方法的主体中,将直接序列化的对象返回到流中
    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类继承并