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;}
}
Eu tenho um Json String parecido com este
var jsonStudentData = @"{""Name"":""ABC"",""Subjects"":[{""Name"":""English""},{""Name"":""Maths""},{""Name"":""Hindi""},{""Name"":""Social Studies""}]}";
Este é o meu código em que estou desserializando jsonStudentData
JsonConvert.DeserializeObject<Student>(jsonStudentData);
Estou recebendo o resultado
Nome = ABC, Assunto [Inglês, Matemática, Inglês, Matemática, Hindi, Estudos Sociais]
mas eu quero saída
Nome = ABC, Assunto [Inglês, Matemática, Hindi, Estudos Sociais]
Estou fazendo algo errado aqui.
Respostas:
1 para resposta № 1Bem, suas expectativas estão incorretas. Basicamente, o desserializador JSON é - razoavelmente, IMO - código de execução equivalente a:
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" },
}
};
Isso é o que seu JSON basicamente diz que deve fazer. É o seu SetDefaultSubjects
que é adicionar mais informações, independentemente do que o JSON diz.
Eu pessoalmente te sugeriria remover a chamada para SetDefaultSubjects
do seu construtor - talvez adicione um método de fábrica de CreateStudentWithDefaultSubjects
.
Você também pode considerar fazer seu List
um conjunto de algum tipo (por exemplo HashSet
) e fazer Subject
implemento IEquatable<Subject>
, para que você possa adicionar duplicatas e elas serão ignoradas.
0 para resposta № 2
Como alternativa, você pode usar a função C # para desserializar.
Montagem: System.Web.Extensions (em 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);