Сериализация и десериализация коллекции объектов - PullRequest
1 голос
/ 29 октября 2019

Я пытаюсь создать читатель Rssfeed, который сохраняет информацию о подкасте в файл JSON, и у меня возникают проблемы с сериализацией и десериализацией в этот файл.

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

Итак, у меня есть немного кода, который создает файл, если он не существует, и записывает в него данные JSONчто выглядит так:

public void SaveFile(Podcast podcast)
{
    try
    {
        JsonSerializer serializer = new JsonSerializer();

        if(!File.Exists(@"C: \Users\Kasper\Desktop\Projektuppgift\Projektuppgift - Delkurs2\Projektet\Projektet\bin\Debug\podcasts.json"))
        {
            string json = JsonConvert.SerializeObject( new { Podcast = podcast });
            StreamWriter sw = File.CreateText(@"C:\Users\Kasper\Desktop\Projektuppgift\Projektuppgift-Delkurs2\Projektet\Projektet\bin\Debug\podcasts.json");
            using (JsonWriter writer = new JsonTextWriter(sw))
            {
                serializer.Serialize(writer, json);
            }
        }
        else
        {
            var filepath = @"C:\Users\Kasper\Desktop\Projektuppgift\Projektuppgift-Delkurs2\Projektet\Projektet\bin\Debug\podcasts.json";
            var jsonData = File.ReadAllText(filepath);
            var podcasts = JsonConvert.DeserializeObject<List<Podcast>>(jsonData) ?? new List<Podcast>();
            podcasts.Add(podcast);
            jsonData = JsonConvert.SerializeObject(new {PodcastList = podcasts });
            File.WriteAllText(filepath, jsonData);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("IO Exception ", ex.Message);
    }
}

То, что я не могу заставить работать, это десериализовать из этого файла и добавить к нему объект. Есть ли более простой способ добавить больше данных в файл JSON или я что-то упустил?

Класс Podcast выглядит следующим образом:

public class Podcast
{
    public string url { get; set; }

    public string name { get; set; }

    public int updateInterval { get; set; }

    public string category { get; set; }
    //public Category category = new Category();

    public List<Episode> episodes { get; set; }

    public Podcast(string url, string name, Category category, List<Episode> episodes, int updateInterval)
    {
        this.url = url;
        this.name = name;
        this.category = category.name;
        this.episodes = episodes;
        this.updateInterval = updateInterval;
    }

    public Podcast(Podcast p)
    {
        this.url = p.url;
        this.name = p.name;
        this.category = p.category;
        this.episodes = p.episodes;
        this.updateInterval = p.updateInterval;
    }
}

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Похоже, здесь есть несколько проблем:

  1. Вы проверяете наличие файла, отличного от того, который вы читаете / пишете. В предыдущем имени файла есть лишние пробелы. Лучший способ избежать этой проблемы - использовать переменную для хранения имени файла, а не жестко кодировать его в трех отдельных местах.
  2. Вы не согласны с форматом JSON, который вы пишете и читаете:
    • Когда вы впервые создаете файл (в первой ветви), вы пишете объект JSON, который содержит свойство Podcast, которое затем содержит один подкаст.
    • Когда вы пытаетесь прочитать файл JSON, вырассматривая весь JSON как список подкастов.
    • После добавления нового подкаста в список вы записываете JSON как отдельный объект, содержащий свойство PodcastList, которое затем содержит список.

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

public static List<Podcast> ReadPodcastsFromFile(string filepath)
{
    if (!File.Exists(filepath)) return new List<Podcast>();

    string json = File.ReadAllText(filepath);
    return JsonConvert.DeserializeObject<List<Podcast>>(json);
}

public static void WritePodcastsToFile(List<Podcast> podcasts, string filepath)
{
    string json = JsonConvert.SerializeObject(podcasts);
    // This will overwrite the file if it exists, or create a new one if it doesn't
    File.WriteAllText(filepath, json);
}

Затем вы можете упростить ваш метод SaveFile довот это (мне хотелось бы переименовать его в SavePodcast):

public void SaveFile(Podcast podcast)
{
    var filepath = @"C:\Users\Kasper\Desktop\Projektuppgift\Projektuppgift-Delkurs2\Projektet\Projektet\bin\Debug\podcasts.json";
    List<Podcast> podcasts = ReadPodcastsFromFile(filepath);
    podcasts.Add(podcast);
    WritePodcastsToFile(podcasts, filepath);
}

Обратите внимание, что я также удалил обработку исключений из SaveFile. Вы должны переместить это туда, где вызывается SaveFile, чтобы вы могли предпринять соответствующие действия в этом случае, если выдается исключение, например:

try
{
    SaveFile(podcast);
}
catch (Exception ex)
{
    // Show a message to the user indicating that the file did not save
}
0 голосов
/ 29 октября 2019

Я просто все еще изучаю c #, но, возможно, вы десериализуетесь в список подкастов, а при сериализации вы серлизируете в тип объекта.

...