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

Установка IgnoreSerializableAttribute глобально в Json.net

Я работаю над проектом ASP.NET WebApi (Release Candidate), где я потребляю несколько DTO, отмеченных атрибутом [Serializable]. Эти DTO находятся вне моего контроля, поэтому я никак не могу их модифицировать. Когда я возвращаю любой из них из метода get, полученный JSON содержит кучу k__BackingFields, например:

<Name>k__BackingField=Bobby
<DateCreated>k__BackingField=2012-06-19T12:35:18.6762652-05:00

Основываясь на результатах поиска, которые я сделал, это похоже на проблему с настройкой JSON.NET IgnoreSerializableAttribute и для решения моей проблемы мне просто нужно установить ее глобально как говорится в статье. Как изменить этот параметр глобально в проекте ASP.NET Web api?

4b9b3361

Ответ 1

Я нашел простой способ избавиться от k__BackingField в именах.

Этот фрагмент должен быть где-то в Application_Start() в Global.asax.cs:

JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings();
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings;

Похоже, что настройка по умолчанию позаботится об этом.

Ответ 2

Поскольку библиотека не предоставляет статический установщик для DefaultContractResolver, я предлагаю вам создать статическую оболочку поверх JsonConvert и ее методы Serialize */Deserialize * (по крайней мере, те, которые вы используете).

В вашей статической обертке вы можете определить статический разрешитель контракта:

private static readonly DefaultContractResolver Resolver = new DefaultContractResolver
{
    IgnoreSerializableAttribute = true
};

Это можно передать каждому методу сериализации в JsonSerializerSettings внутри вашей обертки. Затем вы вызываете свой класс во время своего проекта.

Альтернативой было бы получить исходный код JSON.NET и настроить его самостоятельно, чтобы использовать этот атрибут по умолчанию.

Ответ 3

Друзья, не объявляйте свойства следующим образом:

public String DiscretionCode { get; set; } 

Но создайте вспомогательные вары, как старые....

private String discretionCode;

public String DiscretionCode 
{ 
    get { return discretionCode;}
    set { discretionCode = value; }
}