Что такое JsonConverter по умолчанию, используемый в JSON.NET?
Я пытаюсь написать пользовательский JsonConverter для случаев, когда человек подклассифицирует список или коллекцию, но затем добавляет дополнительные свойства в подкласс (см. здесь). Текущая реализация JSON.NET просто изменяет список на массив дочерних объектов и игнорирует все добавленные свойства. Поэтому я хочу написать новый JsonConverter, который обрабатывает объект, как если бы он не был List, и просто сериализовать все остальное как обычно, но затем добавить новое свойство в сериализацию, называемую "_Items", где фактический массив данных сохранены.
Теперь я уже написал класс, который делает именно это для нашего конкретного подкласса List, но мне пришлось вручную указывать все свойства один за другим. Но если бы я мог написать конвертер, который рассматривал бы это как обычный объект, тогда вручную обрабатывать предметы, я был бы золотым. Мне все равно, если я в конечном итоге дублирую половину другого класса (или даже больше!), Но я бы хотел сделать многоразовый конвертер для этих случаев. Однако, как я уже сказал, я не могу найти конвертер по умолчанию, начиная с.
Итак... кто-нибудь знает, где это?
Ответы
Ответ 1
В JSON.NET нет конвертера по умолчанию.
Если вы можете исследовать класс JsonSerializerInternalWriter, посмотрите на метод SerializeValue
. В нем сверху находится фаза "найти и выполнить конвертер". Однако, если нет соответствующего преобразователя, он прибегает к сериализации типа контракта (оператор switch).
Я не нашел способа (правильный способ или изящный хак), чтобы иметь возможность выполнять обобщенную сериализацию контракта (например, анализировать объект как обычно) с расширенной настраиваемой сериализацией для объекта (который, я полагаю, вы пытаетесь делать).
Ответ 2
Как сказано здесь @dbc, вы можете переопределить CanRead
и CanWrite
, чтобы вернуть false
и зарегистрировать CustomAsDefaultConvertor : JsonConverter
для вашей собственности.
Мой случай:
public class AsDefaultConverter : JsonConverter<JObject>
{
public override JObject ReadJson(JsonReader reader, Type objectType, JObject existingValue, bool hasExistingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, JObject value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanWrite => false;
public override bool CanRead => false;
}
MyModel:
public class MyModel
{
/// <summary>
/// Gets or sets event id
/// </summary>
public string EventId { get; set; }
/// <summary>
/// Gets or sets trigger name
/// </summary>
public string Name { get; set; }
/// <summary>
/// Gets or sets arguments
/// </summary>
[JsonConverter(typeof(AsDefaultConverter))]
public JObject Arguments { get; set; }
/// <summary>
/// Gets or sets trigger creation date
/// </summary>
public DateTimeOffset Created { get; set; }
/// <summary>
/// Gets or sets trigger creator
/// </summary>
public User CreatedBy { get; set; }
}
При запуске я переопределил стандартную JsonSerialization в своем обычае, но для свойства JObject Arguments
я указал конвертер, который мне нужен в этом случае.