Json.NET 6.0.1为记录和受歧视的工会添加F#支持。当使用Json.NET序列化F#记录类型时,我现在可以获得格式良好的JSON。
序列化完成如下:
let converters = [| (new StringEnumConverter() :> JsonConverter) |]
JsonConvert.SerializeObject(questionSet, Formatting.Indented, converters)
但是,当我尝试通过用C#编写的ASP.NET WebApi 5.0服务公开我的F#类型时,序列化的JSON包含所有属性的@ -sign infront。 @ -sign来自记录类型的内部支持字段(这曾经是Json.Net和F#的已知问题)。
但是 - 因为我使用的是Json.NET的更新版本,结果应该与调用JsonConvert时的结果相同吗?或JsonConvert
的行为与JsonTextWriter
和JsonTextReader
不同?
据我所知,通过阅读WebApi源JsonMediaTypeFormatter
中的JsonTextWriter
和WebApi使用JsonTextReader
。
答案 0 :(得分:9)
您可以使用[<CLIMutable>]
属性装饰您的记录:
[<CLIMutable>]
type MyDtr = {
Message : string
Time : string }
对于精美的XML格式,您可以使用:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer <- true
对于漂亮的JSON格式,您可以使用:
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver <-
Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
答案 1 :(得分:5)
我认为这是因为F#记录发出的支持字段不遵循与C#属性支持字段相同的命名约定。
我发现解决此问题的最简单方法是在System.Net.Http.Formatting.JsonContractResolver
启动网络应用程序时更改ContractResolver,改为使用Newtonsoft.Json.Serialization.DefaultContractResolver
: -
Formatters.JsonFormatter.SerializerSettings.ContractResolver <- DefaultContractResolver()
然后,您将通过Newtonsoft的JSON格式化程序而不是NET格式化程序完成所有JSON格式化。