我正在尝试创建一个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;
}
}
答案 0 :(得分:0)
我仍在学习c#,但可能是您将序列化为一系列播客,而序列化时则是序列化为对象类型。
答案 1 :(得分:0)
这里似乎有几个问题:
Podcast
的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
}