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

Что такое JsonConverter по умолчанию, используемый в JSON.NET?

Я пытаюсь написать пользовательский JsonConverter для случаев, когда человек подклассифицирует список или коллекцию, но затем добавляет дополнительные свойства в подкласс (см. здесь). Текущая реализация JSON.NET просто изменяет список на массив дочерних объектов и игнорирует все добавленные свойства. Поэтому я хочу написать новый JsonConverter, который обрабатывает объект, как если бы он не был List, и просто сериализовать все остальное как обычно, но затем добавить новое свойство в сериализацию, называемую "_Items", где фактический массив данных сохранены.

Теперь я уже написал класс, который делает именно это для нашего конкретного подкласса List, но мне пришлось вручную указывать все свойства один за другим. Но если бы я мог написать конвертер, который рассматривал бы это как обычный объект, тогда вручную обрабатывать предметы, я был бы золотым. Мне все равно, если я в конечном итоге дублирую половину другого класса (или даже больше!), Но я бы хотел сделать многоразовый конвертер для этих случаев. Однако, как я уже сказал, я не могу найти конвертер по умолчанию, начиная с.

Итак... кто-нибудь знает, где это?

4b9b3361

Ответ 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 я указал конвертер, который мне нужен в этом случае.