如何使用ServiceStack.Text JsonSerializer将数据从文件反序列化为自定义类?

时间:2012-11-27 16:31:19

标签: c# json servicestack

我的学生班有以下结构:

    public class Student
    {
       public int StudentId {get;set;}
       public string StudentName {get;set;}
       public string[] Courses {get;set;}
    }

我有一个student.json文件,它保存Student类的数据,如下所示:

    public void SaveStudentData(Student stud, string path)   //stud is an object of student class that has student information
    {
        string studinfo = JsonSerializer.SerializeToString<Student>(stud);
        StreamWriter sw = File.OpenText(path);
        sw.Write(studinfo);

    }

但是,当我尝试使用以下代码检索数据时:

    public Student GetStudentData(string path)
    {
       StreamReader sr = File.OpenText(path);
       string stud = sr.ReadToEnd();
       sr.Close();
       Student studinfo =JsonSerializer.SerializeToString<Student>(stud);
       return studinfo;

    }

该行

   Student studinfo =JsonSerializer.SerializeToString<Student>(stud);
VS 2012突出显示

表示它无法将String类型转换为Student类型。我想将json数据从file转换为Student类。我该怎么办?

2 个答案:

答案 0 :(得分:2)

looking here之后

我建议你通过调用

来反序列化更多运气
T JsonSerializer.DeserializeFromString<T>(string value)

方法,而不是SerializeToString<T>,它与您想要的相反。非常一般,

Student studinfo = JsonSerializer.DeserializeFromString<Student>(stud);

由于您是using ServiceStack.Text程序集,因此可以使用T.ToJson()string.FromJson<T>()扩展程序,如@mythz所述。

答案 1 :(得分:0)

您正在使用SerializeToString,您之前的代码会返回string类型。也许你应该尝试一个返回Student对象的方法。

我不熟悉您正在使用的库。您可以使用DataContractJsonSerializer对对象进行序列化和反序列化。

    public void Save(Student student, string path)
    {
        FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Student));
        ser.WriteObject(fs, student);
        fs.Close();
    }

    public Student Load(string path)
    {
        FileStream fs = new FileStream(path, FileMode.Open);
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Student));
        Student s = (Student)ser.ReadObject(fs);
        fs.Close();
        return s;
    }

学生对象被装饰的地方

[DataContract]
public class Student
{
    [DataMember]
    public int StudentId { get; set; }
    [DataMember]
    public string StudentName { get; set; }
    [DataMember]
    public string[] Courses { get; set; }
}