在程序 c# 开始时加载 JSON 数据

Posted

技术标签:

【中文标题】在程序 c# 开始时加载 JSON 数据【英文标题】:Loading JSON data at start of program c# 【发布时间】:2019-03-10 22:12:54 【问题描述】:

我正在尝试将已序列化的数据加载到 JSON 文件中。我希望我的程序能够工作,以便在重新打开控制台应用程序后将保存的数据买回程序内存。

我的类定义如下:

public class Student
        public string StudentName  get; set;  
        public Dictionary<string, int> GradesRecord = new Dictionary<string, int>();
        public Guid StudentId  get; set;    
    

public class Subject
        public string SubjectName  get; set; 
        public Guid SubjectId  get; set; 
        public int MaxMarkAvail;
    

public class ClassOfStudents
        public List<Student> Students = new List<Student>();
        public List<Subject> Subjects = new List<Subject>();
        public void AddSubject(Subject subjectName)
            Subjects.Add(subjectName);
        
        public void AddStudent(Student studentName)
            Students.Add(studentName);
        
    

我有一个保存学生成绩的方法。

private static void ConvertStudentGradesToJson()
        
            var studentsgrades = ClassOfStudents.Students.Select(x => new  x.StudentName, x.StudentId, x.GradesRecord );

            JsonSerializer serializer = new JsonSerializer();
            serializer.NullValueHandling = NullValueHandling.Ignore;

            using (StreamWriter sw = new StreamWriter(@"StudentsGrades.JSON"))
            using (JsonWriter writer = new JsonTextWriter(sw))
            
                writer.Formatting = Formatting.Indented;
                serializer.Serialize(writer, studentsgrades);
            
        

现在,当我关闭程序时,会创建 StudentsGrades.JSON 文件。

我想知道一旦程序关闭后重新打开,如何将此信息加载回程序内存中。

注意:我是 JSON 新手。请原谅我对 JSON 的工作原理缺乏了解。

谢谢

【问题讨论】:

为什么不在你的 main 方法中加载文件并反序列化它呢?还是您在问如何读取和反序列化 JSON 文件? 一些示例 JSON?您可以使用 NuGet 中的 newtonsoft.Json。 我不知道如何加载文件并对其进行序列化。我是否必须将其取消实现,然后将其再次保存在 ClassOfStudents.Students 中?如果是,我该怎么做? 是的,你会从你保存的 Json 中反序列化。但是那里的 ClassOfStudents 是什么? 顺便说一句,你为什么不使用数据库呢?使用 JSON 文件作为数据库是自找麻烦(除非您的意思是您总是只与少数学生打交道)。如果你仍然想要 JSON,你可以说使用 MongoDB 作为数据库。 【参考方案1】:

重新打开应用时调用此方法:

public void LoadJson(string filePath="@StudentsGrades.JSON")

    using (StreamReader r = new StreamReader(filePath))
    
        string json = r.ReadToEnd();
        List<Students> Students = JsonConvert.DeserializeObject<List<Students>>(json);
    

注意:你应该使用Newtonsoft.Json

【讨论】:

请注意:以上必须使用“Newtonsoft.Json.dll” @HamedNaeemaei, List&lt;Students&gt; Students 在这种情况下具有全局范围,因此 OP 可以在其程序的任何位置使用它。 @HamedNaeemaei 感谢您的回答。现在的问题是它抛出一个异常,说另一个进程正在使用有问题的文件。我很确定它指的是我的ConvertToJson() 方法,因为这是我将数据序列化的地方。我不明白为什么这会导致并发方面的冲突,我认为LoadJson() 方法将在程序开始时执行。知道为什么会这样吗? @Sam 你应该在 ConvertStudentGradesToJson 方法中写入后关闭 StreamWriter (sw) 和 JsonTextWriter (writer) @Hamed Naeemaei 谢谢,这编译,但是,它仍然不加载数据。一个我关闭我的控制台应用程序并重新打开它并查看学生成绩,它表明那里没有学生。本质上,我希望能够更新数据,而不是覆盖

以上是关于在程序 c# 开始时加载 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

运行时无法加载文件或程序集“Newtonsoft.Json,版本=6.0.0.0 ...”,间接依赖程序集继续寻找旧版本

如何监控一个c#程序

SwiftUI:尝试加载本地 JSON 数据时,Canvas 出现预览错误

将 JSON 数据加载到 C# 类中[重复]

JSON 与 C# 简介

如何在android中将json数据加载到片段中