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

时间:2014-04-01 14:53:22

标签: serialization asp.net-web-api f# json.net

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的行为与JsonTextWriterJsonTextReader不同?

据我所知,通过阅读WebApi源JsonMediaTypeFormatter中的JsonTextWriter和WebApi使用JsonTextReader

2 个答案:

答案 0 :(得分:9)

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

[<CLIMutable>]
type MyDtr = {
    Message : string
    Time : string }

That's what I do


对于精美的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格式化。