Регистрация пользовательского JsonConverter по всему миру в Json.Net

Используя Json.Net , у меня есть свойства в моих объектах, которые нуждаются в особой заботе, чтобы сериализовать / десериализовать их. Создав потомка JsonConverter , мне удалось добиться этого. Это общий способ сделать это:

 public class SomeConverter : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { ... } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { ... } public override bool CanConvert(Type objectType) { ... } } class SomeClass { [JsonProperty, JsonConverter(typeof(SomeConverter))] public SomeType SomeProperty; } //Later on, in code somewhere SomeClass SomeObject = new SomeClass(); string json = JsonConvert.SerializeObject(SomeObject, new SomeConverter()); 

Моя проблема с этим кодом заключается в том, что мне нужно представить свой собственный конвертер в каждой сериализации / десериализации. В моем проекте есть много случаев, когда я не могу этого сделать. Например, я использую другие внешние проекты, которые также используют Json.Net, и они будут работать над моими экземплярами SomeClass . Но поскольку я не хочу или не могу внести изменения в свой код, у меня нет возможности представить мой конвертер.

Есть ли способ зарегистрировать мой конвертер, возможно, используя какой-то static член в Json.Net, поэтому независимо от того, где происходит сериализация / десериализация, мой конвертер всегда присутствует?

Да, это возможно с помощью Json.Net 5.0.5 или новее. См. JsonConvert.DefaultSettings .

 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = new List { new SomeConverter() } }; // Later on... string json = JsonConvert.SerializeObject(someObject); // this will use SomeConverter 

Если вы используете Web API, вы можете настроить глобальный конвертер следующим образом:

 var config = GlobalConfiguration.Configuration; var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings; jsonSettings.Converters.Add(new SomeConverter()); 

Другой подход (который выигрывает в приоритете над одним из приведенных выше @Brian) заключается в том, чтобы реализовать пользовательский разрешитель контракта

 JsonFormatter.SerializerSettings.ContractResolver = new CustomContractResolver(); 

И реализация довольно проста

 public class CustomContractResolver : DefaultContractResolver { private static readonly JsonConverter _converter = new MyCustomConverter(); private static Type _type = typeof (MyCustomType); protected override JsonConverter ResolveContractConverter(Type objectType) { if (objectType == null || !_type.IsAssignableFrom(objectType)) // alternatively _type == objectType { return base.ResolveContractConverter(objectType); } return _converter; } } 

Оба метода действительны, это просто больший молот

  • Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1
  • Объединение двух массивов Json.NET путем конкатенации содержащихся элементов
  • Web API 2: как вернуть JSON с именами свойств camelCased, на объекты и их под-объекты
  • Хранить корпус при сериализации словарей
  • Использование преобразователей Json.NET для десериализации свойств
  • Сериализовать словарь как массив (пар ключей)
  • Исключить свойство из сериализации через пользовательский атрибут (json.net)
  • Как преобразовать массив Json в список объектов в c #
  • JSON.NET - как десериализовать сборку интерфейсных экземпляров?
  • Как показать «вставить class Json» в visual studio 2012, нажав на «Специальная вставка»?
  • Что такое эквивалент JSON.NET XPath, SelectNodes XML, SelectSingleNode?
  • Interesting Posts

    Запросить расписание в BigQuery

    пример слоя данных в каффе

    Как определить, подходит ли SSD для моего планшета / ноутбука?

    Ссылки Firefox на локальные или сетевые страницы не работают

    Что означает селектор CSS ~ (tilde / squiggle / twiddle)?

    Как отправить событие переключения раскладки клавиатуры с помощью autohotkey в Windows 7?

    Visual Studio 2015 чрезвычайно медленная

    Как мой код iPhone Objective-C получит уведомление об ошибках Javascript в UIWebView?

    Получить имя пользователя Windows с помощью JAVA или JSP

    CreateFile: операция прямой записи на необработанный диск «Доступ запрещен» – Vista, Win7

    Самый короткий путь для преобразования одного слова в другое

    jQuery serializeArray не включает кнопку отправки, которая была нажата

    Обтекание с помощью раздела CData – Сериализация XML C #

    Может ли какой-то хакер украсть файл cookie у пользователя и войти с этим именем на веб-сайт?

    Будет ли Microsoft Security Essentials адекватной защитой?

    Давайте будем гением компьютера.