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表现得JsonTextWriter和JsonTextReader?不同?
据我从读讲JsonMediaTypeFormatter在的WebAPI源JsonTextWriter和JsonTextReader所使用的的WebAPI.
您可以使用以下[<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)
我相信这是因为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格式化.
| 归档时间: |
|
| 查看次数: |
1904 次 |
| 最近记录: |