Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化和反序列化对象集合_C#_Json_Serialization_Json.net_Json Deserialization - Fatal编程技术网

C# 序列化和反序列化对象集合

C# 序列化和反序列化对象集合,c#,json,serialization,json.net,json-deserialization,C#,Json,Serialization,Json.net,Json Deserialization,我正在尝试创建一个Rssfeed阅读器,它可以将播客的信息保存到一个JSON文件中,但是我在序列化和反序列化该文件时遇到了问题 我意识到关于这个主题还有其他的线索,但我无法理解如何将它应用到我的代码或其背后的推理中 因此,我有一段代码,如果文件不存在,则创建一个文件,并将JSON数据写入其中,如下所示: public void SaveFile(Podcast podcast) { try { JsonSerializer serializer = new Jso

我正在尝试创建一个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);
    }
}

我仍在学习c,但可能是反序列化到一个播客列表中,当你序列化时,你正在序列化到一个对象类型。

我仍在学习c,但可能是反序列化到一个播客列表中,当你序列化时,你正在序列化到一个对象类型。

似乎有几个问题这里的问题:

  • 您正在检查是否存在与正在读/写的文件不同的文件。前一个文件名中有额外的空格。避免此问题的最佳方法是使用变量来包含文件名,而不是在三个单独的位置对其进行硬编码
  • 您正在编写和读取的JSON格式不一致:
    • 当您第一次创建文件(在第一个分支中)时,您正在编写一个JSON对象,该对象包含一个属性
      Podcast
      ,该属性随后包含一个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
    中删除了异常处理。您应该将其移动到调用
    SaveFile
    的任何位置,以便在引发异常时可以在该位置采取适当的操作,例如:

    try
    {
        SaveFile(podcast);
    }
    catch (Exception ex)
    {
        // Show a message to the user indicating that the file did not save
    }
    

    这里似乎有几个问题:

  • 您正在检查是否存在与正在读/写的文件不同的文件。前一个文件名中有额外的空格。避免此问题的最佳方法是使用变量来包含文件名,而不是在三个单独的位置对其进行硬编码
  • 您正在编写和读取的JSON格式不一致:
    • 当您第一次创建文件(在第一个分支中)时,您正在编写一个JSON对象,该对象包含一个属性
      Podcast
      ,该属性随后包含一个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
    中删除了异常处理。您应该将其移动到调用
    SaveFile
    的任何位置,以便在引发异常时可以在该位置采取适当的操作,例如:

    try
    {
        SaveFile(podcast);
    }
    catch (Exception ex)
    {
        // Show a message to the user indicating that the file did not save
    }
    

    new{Podcast=Podcast}
    --您可能想在那里创建一个新的
    列表
    ,而不是一个带有单个
    Podcast
    属性的新匿名对象。
    new{Podcast=Podcast}
    --您可能想在那里创建一个新的
    列表
    ,不是一个新的匿名对象,只有一个
    Podcast
    属性。然后如何序列化到Podcast列表?或者你会用另一种方式序列化它吗?我不知道我使用json serialise的次数。我通常使用它们的属性/标记我的数据,这样有助于映射,尝试查看json中的attrinbutes,然后如何序列化到播客列表?或者你会用另一种方式序列化它吗?我不知道我使用json serialise的时间,我通常使用它们的属性/标记我的数据,这样有助于映射,请尝试查看json中的attrinbutes