Serialization F#,Json.NET 6.0和WebApi-记录类型的序列化

Serialization F#,Json.NET 6.0和WebApi-记录类型的序列化,serialization,asp.net-web-api,f#,json.net,Serialization,Asp.net Web Api,F#,Json.net,增加了对记录和歧视工会的F#支持。当使用Json.NET序列化F#记录类型时,我现在得到格式良好的Json 序列化操作如下所示: let converters = [| (new StringEnumConverter() :> JsonConverter) |] JsonConvert.SerializeObject(questionSet, Formatting.Indented, converters) 然而,当我试图通过ASP.NET WebApi 5.0服务(用C#编写)公开我

增加了对记录和歧视工会的F#支持。当使用Json.NET序列化F#记录类型时,我现在得到格式良好的Json

序列化操作如下所示:

let converters = [| (new StringEnumConverter() :> JsonConverter) |]
JsonConvert.SerializeObject(questionSet, Formatting.Indented, converters)
然而,当我试图通过ASP.NET WebApi 5.0服务(用C#编写)公开我的F#类型时,序列化的JSON在所有属性前面都包含@符号。@-符号来自记录类型的内部支持字段(这曾经是Json.Net和F#的一个已知问题)

但是-既然我使用的是更新版本的Json.NET,那么结果不应该与调用JsonConvert时相同吗?或者
jsonvert
的行为是否与
JsonTextWriter
JsonTextReader
不同


从WebApi源代码中的
JsonTextWriter
JsonTextReader
中的
JsonMediaTypeFormatter
可以看出,WebApi使用了
JsonTextReader

您可以使用
[]
属性装饰您的记录:

[<CLIMutable>]
type MyDtr = {
    Message : string
    Time : string }
[]
类型MyDtr={
消息:string
时间:字符串}


要获得良好的XML格式,可以使用:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer <- true
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver <-
    Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer我认为这是因为F#记录发出的支持字段与C#属性支持字段不遵循相同的命名约定

我发现解决这个问题的最简单方法是在web应用程序启动时将ContractResolver从
System.Net.Http.Formatting.JsonContractResolver
更改为使用
Newtonsoft.Json.Serialization.DefaultContractResolver
:-

Formatters.JsonFormatter.SerializerSettings.ContractResolver <- DefaultContractResolver()

Formatters.JsonFormatter.SerializerSettings.ContractResolver表面上与从F#使用Json.NET有关:好吧,我想它会起作用,但它并没有真正回答这个问题(为什么WebAPI提供的序列化Json与直接调用JsonConvert不同)。既然Json.NET正确地支持F#,我们就不必进行那样的定制了……我知道,我还没有深入探讨其原因。。。我并不是说我回答了这个问题,但我想,在你得到这个问题的答案之前,我会与你分享一些已知的有效方法,至少:)是的,同意——并且非常感谢——现在将采用这个解决方案,因为我现在没有时间深入研究Json.NET和/或WebAPI源代码。干杯,JonasI有一个由属性修饰的记录,但是
DefaultContractResolver
仍然附加
@
。唯一可行的办法是:@abatishchev你有没有按照链接读过这篇文章?它解释了您还必须修改格式化程序。+1。默认情况下,Web API使Newtonsoft使用System.Web.Http.Formatting.JsonContractResolver,这解释了为什么代码中的“香草”Json.net序列化行为与Web API不同。设置为NewtonSoft默认值有效(无需强制使用camelCase,您可以使用,也可以不使用)。您的帖子在这里回答了我的问题:。但是,我仍然需要了解DefaultContractResolver和默认使用的解析程序之间的差异。我在这里找到了源代码: