/ / Json Deserialised не заменя стойностите по подразбиране в свойството - c #, json, serialization, deserialization

Json Deserialized не заменя стойностите по подразбиране в собствеността - c #, json, serialization, deserialization

 public class Student
{
public string Name { get; set;} = "ABCD";
public List<Subject> Subjects {get; set;}
public Student()
{
Subjects = new List<Subject>();
SetDefaultSubject();
}

private void SetDefaultSubject()
{
this.Subjects.Add(new Subject(){Name = "English"});
this.Subjects.Add(new Subject(){Name = "Maths"});
}
}

public class Subject
{
public string Name {get; set;}
}

Имам Json String, който изглежда така

var jsonStudentData = @"{""Name"":""ABC"",""Subjects"":[{""Name"":""English""},{""Name"":""Maths""},{""Name"":""Hindi""},{""Name"":""Social Studies""}]}";

Това е моят код, където съм десериализиращ jsonStudentData

JsonConvert.DeserializeObject<Student>(jsonStudentData);

Получавам изхода
Име = ABC, Тема [английски, математика, английски език, математика, хинди, социални изследвания]

но искам изход

Име = ABC, Тема [английски, математика, хинди, социални изследвания]

Am I Doing Wrong нещо тук.

Отговори:

1 за отговор № 1

Е, очакванията ви са неправилни. В основата си, десериализаторът на JSON е - напълно разумно, IMO - изпълняващ код, еквивалентен на:

var student = new Student
{
Name = "ABC",
Subjects =
{
// Each line here will just call Add
new Subject { Name = "English" },
new Subject { Name = "Maths" },
new Subject { Name = "Hindi" },
new Subject { Name = "Social Studies" },
}
};

Това е това, което вашето JSON основно казва, че трябва да направи SetDefaultSubjects което добавя повече информация, независимо от това, което JSON казва.

Аз лично бих ви предложил Премахване обаждането до SetDefaultSubjects от вашия конструктор - може би ще добавите фабричен метод на CreateStudentWithDefaultSubjects.

Може да помислите и за това List комплект от някакъв вид (напр. HashSet) и направете Subject изпълнение IEquatable<Subject>, така че можете да добавяте дубликати и те ще бъдат игнорирани.


0 за отговор № 2

Като алтернатива можете да използвате функцията C # за десериализиране.

Сглобяване: System.Web.Extensions (в System.Web.Extensions.dll)

    string jsonStudentData = @"{""Name"":""ABC"",""Subjects"":[{""Name"":""English""},{""Name"":""Maths""},{""Name"":""Hindi""},{""Name"":""Social Studies""}]}";
JavaScriptSerializer serializer = new JavaScriptSerializer();
Student  newStudent = serializer.Deserialize<Student>(jsonStudentData);