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 № 1Twoje 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);