Подтвердить что ты не робот

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.

4b9b3361

Ответ 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.