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

Jon*_*esø 14 serialization f# json.net asp.net-web-api

Json.NET 6.0.1为记录和受歧视的联合添加了F#支持.当使用Json.NET序列化F#记录类型时,我现在可以获得格式良好的JSON.

序列化完成如下:

let converters = [| (new StringEnumConverter() :> JsonConverter) |]
JsonConvert.SerializeObject(questionSet, Formatting.Indented, converters)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试通过用C#编写的ASP.NET WebApi 5.0服务公开我的F#类型时,序列化的JSON包含所有属性的@ -sign infront.@ -sign来自记录类型的内部支持字段(这曾经是Json.Net和F#的已知问题).

但是 - 因为我使用的是Json.NET的更新版本,结果应该与调用JsonConvert时的结果相同吗?或者JsonConvert表现得JsonTextWriterJsonTextReader?不同?

据我从读讲JsonMediaTypeFormatter在的WebAPI源JsonTextWriterJsonTextReader所使用的的WebAPI.

Mar*_*ann 9

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

[<CLIMutable>]
type MyDtr = {
    Message : string
    Time : string }
Run Code Online (Sandbox Code Playgroud)

这就是我的工作.


对于良好的XML格式,您可以使用:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer <- true
Run Code Online (Sandbox Code Playgroud)

对于漂亮的JSON格式,您可以使用:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver <-
    Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
Run Code Online (Sandbox Code Playgroud)

  • 我知道,我还没有潜入其中的原因......我并不认为我的回答是**的问题,但我认为,直到你得到的回答这个问题,我会分享什么已知*工作*,至少:) (2认同)

Isa*_*ham 6

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

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

Formatters.JsonFormatter.SerializerSettings.ContractResolver <- DefaultContractResolver()
Run Code Online (Sandbox Code Playgroud)

然后,您将通过Newtonsoft的JSON格式化程序而不是NET格式化程序完成所有JSON格式化.