不创建和加载 .JSON 文件 c#
Not creating and loading .JSON file c#
我试图在我的程序开头加载现有的 .json
文件(如果它们已经存在),如果它们不存在则创建它们。当我第一次使用它时它正在工作,但现在我已经将我的程序分成几层,它已经停止工作了。谁能知道为什么会这样?
public static void ConvertStudentsToJson()
{
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(@"C:\Users\source\repos\ConsoleApp1\Grades.Data\bin\Debug\StudentsGrades.JSON"))
{
using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.Indented;
serializer.Serialize(writer, studentsgrades);
writer.Close();
sw.Close();
}
}
}
public static void LoadJson()
{
//loading students grades
if (File.Exists(@"C:\Users\source\repos\ConsoleApp1\Grades.Data\bin\Debug\StudentsGrades.JSON"))
{
using (StreamReader r = new StreamReader(@"C:\Users\source\repos\ConsoleApp1\Grades.Data\bin\Debug\StudentsGrades.JSON"))
{
string json = r.ReadToEnd();
ClassOfStudents.Students = JsonConvert.DeserializeObject<List<Student>>(json);
r.Close();
}
}
else
{
File.Create(@"C:\Users\source\repos\ConsoleApp1\Grades.Data\bin\Debug\StudentsGrades.JSON");
}
}
ClassOfStudents class如下:
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);
}
}
主题class如下:
public class Subject
{
public string SubjectName { get; set; }
public Guid SubjectId { get; set; }
public int MaxMarkAvail;
}
在我的 program.cs 中,我已经初始化 classofstudents 如下:
public static ClassOfStudents ClassOfStudents = new ClassOfStudents();
当我想查看我的主题时,调用此方法:
public static void ViewSubjectsPool()
{
Console.Write(Line);
Console.WriteLine("\nPlease find updated subjects pool below");
Console.Write(Line + "\n");
foreach (var subjectname in ClassOfStudents.Subjects)
{
Console.WriteLine("Subject Id: " + subjectname.SubjectId + "| Subject Name: " + subjectname.SubjectName + "| Max Available Mark = " + subjectname.MaxMarkAvail);
}
Console.Write(Line + "\n\n");
}
谢谢
虽然没有多少信息可以告诉您,但这里有用的是您可以通过故障排除来解决这个问题。更重要的是,对您的代码进行故障排除是一项需要时间开发的 skill/art,因此这对您来说是一个绝佳的机会。
我会把它分成几个练习,因为你不确定错误在哪里。
测试你的加载方法 - 确保你有一个有效的 JSON 文件(从你工作的时候开始)存储在该路径中,在你的加载方法上设置一个断点,然后步骤通过这。一旦你这样做了,你就会知道文件是否加载失败(一个失败点,例如 UAC 不允许你访问),如果可行,你的原始 json 看起来是否如你所期望的那样(在 VS IDE 你可以将鼠标悬停在它上面或使用直接 window。如果没问题,你的反序列化方法 return 是预期的对象结构吗?
测试您的保存方法。添加断点,用实际结果调用保存,知道预期结果。然后,当您逐步执行代码时,您可以找到失败的语句,并将您的故障排除工作集中在那里。
另外,添加一些 try/catch 语句(我不知道你现在有什么样的错误处理)(至少)会捕获错误并将其写入控制台。这样,如果您以后在这里遇到错误,您就会知道去哪里找。
我试图在我的程序开头加载现有的 .json
文件(如果它们已经存在),如果它们不存在则创建它们。当我第一次使用它时它正在工作,但现在我已经将我的程序分成几层,它已经停止工作了。谁能知道为什么会这样?
public static void ConvertStudentsToJson()
{
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(@"C:\Users\source\repos\ConsoleApp1\Grades.Data\bin\Debug\StudentsGrades.JSON"))
{
using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.Indented;
serializer.Serialize(writer, studentsgrades);
writer.Close();
sw.Close();
}
}
}
public static void LoadJson()
{
//loading students grades
if (File.Exists(@"C:\Users\source\repos\ConsoleApp1\Grades.Data\bin\Debug\StudentsGrades.JSON"))
{
using (StreamReader r = new StreamReader(@"C:\Users\source\repos\ConsoleApp1\Grades.Data\bin\Debug\StudentsGrades.JSON"))
{
string json = r.ReadToEnd();
ClassOfStudents.Students = JsonConvert.DeserializeObject<List<Student>>(json);
r.Close();
}
}
else
{
File.Create(@"C:\Users\source\repos\ConsoleApp1\Grades.Data\bin\Debug\StudentsGrades.JSON");
}
}
ClassOfStudents class如下:
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);
}
}
主题class如下:
public class Subject
{
public string SubjectName { get; set; }
public Guid SubjectId { get; set; }
public int MaxMarkAvail;
}
在我的 program.cs 中,我已经初始化 classofstudents 如下:
public static ClassOfStudents ClassOfStudents = new ClassOfStudents();
当我想查看我的主题时,调用此方法:
public static void ViewSubjectsPool()
{
Console.Write(Line);
Console.WriteLine("\nPlease find updated subjects pool below");
Console.Write(Line + "\n");
foreach (var subjectname in ClassOfStudents.Subjects)
{
Console.WriteLine("Subject Id: " + subjectname.SubjectId + "| Subject Name: " + subjectname.SubjectName + "| Max Available Mark = " + subjectname.MaxMarkAvail);
}
Console.Write(Line + "\n\n");
}
谢谢
虽然没有多少信息可以告诉您,但这里有用的是您可以通过故障排除来解决这个问题。更重要的是,对您的代码进行故障排除是一项需要时间开发的 skill/art,因此这对您来说是一个绝佳的机会。
我会把它分成几个练习,因为你不确定错误在哪里。
测试你的加载方法 - 确保你有一个有效的 JSON 文件(从你工作的时候开始)存储在该路径中,在你的加载方法上设置一个断点,然后步骤通过这。一旦你这样做了,你就会知道文件是否加载失败(一个失败点,例如 UAC 不允许你访问),如果可行,你的原始 json 看起来是否如你所期望的那样(在 VS IDE 你可以将鼠标悬停在它上面或使用直接 window。如果没问题,你的反序列化方法 return 是预期的对象结构吗?
测试您的保存方法。添加断点,用实际结果调用保存,知道预期结果。然后,当您逐步执行代码时,您可以找到失败的语句,并将您的故障排除工作集中在那里。
另外,添加一些 try/catch 语句(我不知道你现在有什么样的错误处理)(至少)会捕获错误并将其写入控制台。这样,如果您以后在这里遇到错误,您就会知道去哪里找。