ASP. NET Core - Загрузить. json файл и преобразовать в список <T> - PullRequest
0 голосов
/ 28 мая 2020

Итак, мне удалось экспортировать файл. json путем сериализации моего списка. Теперь я пытаюсь загрузить файл. json, деэриализовать его и снова добавить в свой список. Идея состоит в том, чтобы иметь возможность нажать на импорт, выбрать файл, а затем преобразовать его, чтобы я мог добавить его в свой список. Вот функция в моем контроллере, которая не работает:

** Обновление ** Итак, теперь мне удалось преобразовать файл. json обратно в свой список, но если список пуст, и я хочу добавьте к нему новый список, тогда я получаю эту ошибку:

enter image description here

[HttpPost]
    public async Task<IActionResult> Import(IFormFile file)
    {
        if (file == null || file.Length == 0)
            return Content("file not selected");

        var path = Path.Combine(Directory.GetCurrentDirectory(), "Import", file.FileName);

        using (var stream = new FileStream(path, FileMode.Create))
        {
            await file.CopyToAsync(stream);
        }

        String jsonImport = System.IO.File.ReadAllText(path);
        Console.WriteLine(jsonImport);
        List<Booking> bookings;
        _cache.TryGetValue("key", out bookings);
        List<Booking> newList = new List<Booking>();

        newList = JsonConvert.DeserializeObject<List<Booking>>(jsonImport);

        foreach (var item in newList)
        {
            bookings.Add(item);
            _cache.Set<List<Booking>>("key", bookings);
        }
        return RedirectToAction("Index");
    }

Итак, я хочу выбрать файл (пользователю должно быть разрешено только для загрузки. json форматировать ничего, кроме idk, как это сделать), а затем из этого. json Я хочу добавить каждую запись в свой список бронирований. Вот модель бронирования:

public class Booking
{
    [Required]
    [Display(Name = "Ladestand")]
    [Range(0, 100)]
    public double chargeState { get; set; }

    [Required]
    [Display(Name = "Benötigte Fahrstrecke")]
    [Range(1, 1000)]
    public double distance { get; set; }

    [Required]
    [Display(Name = "Beginn")]

    public DateTime startTime { get; set; }

    [Required]
    [Display(Name = "Ende")]

    public DateTime endTime { get; set; }

    [Required]
    [Display(Name = "Anschlusstyp")]
    [EnumDataType(typeof(ConnectorType))]
    public ConnectorType connectorType { get; set; }
}

А вот функция экспорта:

public ActionResult Export()
    {
        string fileName = "BookingsExport.json";
        List<Booking> bookingsList;
        _cache.TryGetValue("key", out bookingsList);

        string json = JsonConvert.SerializeObject(bookingsList);
        FileInfo file = new FileInfo(fileName);
        using (StreamWriter writer = file.CreateText())
        {
            writer.Write(json);
        }

        byte[] fileBytes = System.IO.File.ReadAllBytes(fileName);

        return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Json, fileName);
    }

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Это потому, что если у вас нет значения в кеше, он установит значение null на bookings. Вам необходимо изменить, как показано ниже:

List<Booking> bookings;
var flag = _cache.TryGetValue("key", out bookings);
if(!flag)
{
    bookings = new List<Booking>();
}
1 голос
/ 28 мая 2020

Вам необходимо инициализировать список, прежде чем вы попытаетесь добавить в него новые элементы.

var bookings = new List<Booking>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...