/ / Json Deserialised nie zastępuj wartości domyślnych we właściwości - C #, json, serializacja, deserializacja

Json Deserialised nie zastępuje domyślnych wartości w usłudze - c #, json, serializacja, deserializacja

 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;}
}

Mam ciąg Json, który wygląda tak

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

To jest mój kod, w którym deserializuję jsonStudentData

JsonConvert.DeserializeObject<Student>(jsonStudentData);

Otrzymuję dane wyjściowe
Imię = ABC, Przedmiot [język angielski, matematyka, język angielski, matematyka, hindi, nauki społeczne]

ale chcę wyjście

Imię = ABC, Przedmiot [angielski, matematyka, hindi, nauki społeczne]

Czy ja tu coś złego robię.

Odpowiedzi:

1 dla odpowiedzi № 1

Twoje oczekiwania są błędne. Zasadniczo deserializator JSON - całkiem rozsądnie, IMO - wykonuje kod odpowiadający:

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" },
}
};

To jest to, co zasadniczo mówi twój JSON, że powinien robić. To twój SetDefaultSubjects który dodaje więcej informacji, niezależnie od tego, co mówi JSON.

Osobiście poleciłbym ci usunąć wezwanie do SetDefaultSubjects od konstruktora - być może dodaj metodę fabryczną CreateStudentWithDefaultSubjects.

Możesz również rozważyć utworzenie swojego List jakiś zestaw (np. HashSet) i zrób Subject wprowadzić w życie IEquatable<Subject>, dzięki czemu możesz dodać duplikaty i zostaną one zignorowane.


0 dla odpowiedzi nr 2

Alternatywnie możesz użyć funkcji C # do deserializacji.

Montaż: System.Web.Extensions (w 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);