Десериализация через System.Text.Json в регистронечувствительный HashSet

В общем, есть вот такой класс:

public class DictionarySettings
{
    public string TableName { get; set; }
    public string ConnectionString { get; set; }
    public string IdColumnName { get; set; }
    public HashSet<string> Columns { get;} = new(StringComparer.OrdinalIgnoreCase);
}

Я бы хотел бы, чтобы десериализатор считанные данные занес в уже созданную коллекцию или у меня была возможность сказать ему, что она должна быть создана без зависимости от регистра.

Я как-нибудь могу это сделать?

Знаю, что есть всякие конверторы типов, но как я понял, то я там должен ручками буду описать сериализацию каждого поля и мне не будет достаточно описать только один конкретный, что может быть проблематично, если у меня будет сложный объект, где нужно обработать по особенному только 1 поле.


Ответы (1 шт):

Автор решения: Alexander Petrov

Как насчёт такого варианта. Делаем дополнительный класс

class DictionarySettingsDto
{
    public string TableName { get; set; }
    public string ConnectionString { get; set; }
    public string IdColumnName { get; set; }
    public HashSet<string> Columns { get; set; }
}

Десериализуем json в него, а далее просто маппим его на нужный класс с желаемым компаратором.

var dsDto = JsonSerializer.Deserialize<DictionarySettingsDto>(json);
            
var ds = new DictionarySettings();
            
ds.TableName = dsDto.TableName;
ds.ConnectionString = dsDto.ConnectionString;
ds.IdColumnName = dsDto.IdColumnName;

foreach (var x in dsDto.Columns)
    ds.Columns.Add(x);

// Далее используем ds.

При желании можно прикрутить какой-нибудь маппер.
Но и ручной маппинг, имхо, всяко проще чем написание конвертера.

→ Ссылка