Установка 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?
Ответы
Ответ 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; }
}