В do tnet core вызывается config.GetSection (). Получить не будет загружать значения в объект - PullRequest
1 голос
/ 09 апреля 2020

В моем наборе приложений. json У меня определен следующий массив значений.

"DirectoriesToMonitor": [
  {
    "DirectoryToMonitor": {
      "Directory": "c:\\temp1",
      "IncludeSubDirectories": true,
      "FileTypes": "txt",
      "ZipFiles": false,
      "NotifyOnly": true
    }
  },
  {
    "DirectoryToMonitor": {
      "Directory": "c:\\temp2",
      "FileTypes": "txt",
      "ZipFiles": false,
      "NotifyOnly": true
    }
  }
]

Я пытаюсь загрузить их в список объектов с помощью этого оператора.

List<DirectoryToMonitor> dirs = config.GetSection("DirectoriesToMonitor").Get<List<DirectoryToMonitor>>();

Список «dirs» заполняется 2 объектами, но свойства каждого из объектов не загружаются из наборов приложений.

Я также пробовал это:

List<DirectoryToMonitor> directories = new List<DirectoryToMonitor>();
config.Bind("DirectoriesToMonitor", directories);

И я получаю тот же результат.

namespace FileWatcherEmailer
{
    public class DirectoryToMonitor
    {
        public string Directory { get; set; }
        public bool IncludeSubDirectories { get; set; }
        public string FileTypes { get; set; }
        public bool ZipFiles { get; set; }
        public bool NotifyOnly { get; set; }
    }
}

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Вы должны изменить Базовый класс на этот

public class DirectoryToMonitor
{
    public string Directory { get; set; }
    public bool IncludeSubDirectories { get; set; }
    public string FileTypes { get; set; }
    public bool ZipFiles { get; set; }
    public bool NotifyOnly { get; set; }
}

public class DirectoriesToMonitor
{
    public DirectoryToMonitor DirectoryToMonitor { get; set; }
}

public class RootObject
{
    public List<DirectoriesToMonitor> DirectoriesToMonitor { get; set; }
}

И, наконец, связать json с List<DirectoriesToMonitor>

List<DirectoriesToMonitor> directories = new List<DirectoriesToMonitor>();
config.GetSection("DirectoriesToMonitor").Bind(directories);

Или

List<DirectoriesToMonitor> directories = new List<DirectoriesToMonitor>();
config.Bind("DirectoriesToMonitor", directories);
1 голос
/ 09 апреля 2020

Объект DirectoryToMonitor не не соответствует файлу JSON. Этот файл содержит массив объектов с одним свойством, которое, в свою очередь, содержит свойства, соответствующие классу DirectoryToMonitor.

Строка "DirectoryToMonitor" в файле JSON указывает поле, а не тип объекта , JSON не имеет типов, и любой десериализатор JSON десериализует фрагмент JSON до любого типа, соответствующего его содержимому.

Чтобы ваш код работал, файл JSON должен выглядеть следующим образом:

"DirectoriesToMonitor": [
  {
    "Directory": "c:\\temp1",
    "IncludeSubDirectories": true,
    "FileTypes": "txt",
    "ZipFiles": false,
    "NotifyOnly": true
  },{
    "Directory": "c:\\temp2",
    "FileTypes": "txt",
    "ZipFiles": false,
    "NotifyOnly": true
  }
]

Если вы хотите сохранить файл без изменений, вам нужно использовать новый класс с одним свойством DirectoryToMonitor, содержащим объект DirectoryToMonitor:

class DirectoryToMonitorDTO 
{
    public DirectoryToMonitor DirectoryToMonitor {get; set;}
}

код должен измениться на:

List<DirectoryToMonitor> directories =
    config.GetSection("DirectoriesToMonitor")
          .Get<List<DirectoryToMonitorDTO>>()
          .Select(dto=>dto.DirectoryToMonitor)
          .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...