F #, Json.NET 6.0 и WebApi - сериализация типов записей
Json.NET 6.0.1 добавляет поддержку F # для записей и дискриминационных объединений. При сериализации типа записи F # с использованием Json.NET теперь я получаю красиво отформатированный JSON.
Сериализация выполняется следующим образом:
let converters = [| (new StringEnumConverter() :> JsonConverter) |]
JsonConvert.SerializeObject(questionSet, Formatting.Indented, converters)
Однако, когда я пытаюсь разоблачить свои типы F # через службу ASP.NET WebApi 5.0, написанную на С#, сериализованный JSON включает в себя @-sign infront всех свойств. @-знак поступает из внутреннего поля поддержки для типа записи (это раньше было известной проблемой с Json.Net и F #).
Но - поскольку я использую обновленную версию Json.NET, не должен ли результат быть таким же, как при вызове JsonConvert? Или JsonConvert
ведет себя иначе, чем JsonTextWriter
и JsonTextReader
?
Насколько я могу судить по чтению JsonMediaTypeFormatter
в источнике WebApi JsonTextWriter
и JsonTextReader
используется WebApi.
Ответы
Ответ 1
Вы можете украсить свои записи атрибутом [<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()
Ответ 2
Я считаю, потому что поля поддержки, которые испускаются записями F #, не соответствуют тому же соглашению об именах, что и поля поддержки свойств С#.
Самый простой способ, которым я нашел это, - изменить ContractResolver при запуске вашего веб-приложения из System.Net.Http.Formatting.JsonContractResolver
вместо Newtonsoft.Json.Serialization.DefaultContractResolver
: -
Formatters.JsonFormatter.SerializerSettings.ContractResolver <- DefaultContractResolver()
Затем вы получите все форматирование JSON с помощью форматирования Newtonsoft JSON, а не NET.