Регистрация пользовательского 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 при сериализации Mongo ObjectId
- Как вернуть объект JSon
- Удалить дескриптор объекта json в динамический объект с помощью Json.net
- Создание десериализации свойств, но не сериализация с помощью json.net
- Как добавить дополнительное свойство в сериализованную строку JSON с помощью json.net?
- Исключение «Исключительная привязка к реляционной ссылке» с JSON.Net
- Разбор JSON DateTime от JSON Serializer от Newtonsoft
- Как десериализовать дочерний объект с динамическими (числовыми) именами клавиш?
- как десериализовать JSON в IEnumerable с помощью Newtonsoft JSON.NET
- Как десериализовать данные JSON?
- Уничтожить stream массива json по одному элементу за раз
- Серийный объект Json.NET с корневым именем
- Дезаминирование гетерогенного массива JSON в ковариантный список с использованием 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; } }
Оба метода действительны, это просто больший молот