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。@-符号来自记录类型的内部支持字段(这曾经是 Json.Net 和 F# 的已知问题)。
但是 - 由于我使用的是 Json.NET 的更新版本,结果不应该与调用 JsonConvert 时相同吗?还是JsonConvert
的行为与JsonTextWriter
和JsonTextReader
不同?
据我所知,从阅读WebApi源代码中的JsonMediaTypeFormatter
JsonTextWriter
和WebApi使用JsonTextReader
。
[<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()
这是因为 F# 记录发出的支持字段不遵循与 C# 属性支持字段相同的命名约定。
我发现解决此问题的最简单方法是在 Web 应用程序启动时将 ContractResolver 从 System.Net.Http.Formatting.JsonContractResolver
更改为使用Newtonsoft.Json.Serialization.DefaultContractResolver
:-
Formatters.JsonFormatter.SerializerSettings.ContractResolver <- DefaultContractResolver()
然后,您将通过Newtonsoft的JSON格式化程序而不是NET格式化程序完成所有JSON格式化。