/ / Json desserializado não substitui os valores padrão na propriedade - c #, json, serialização, desserialização

O Json Deserializado não substitui os valores padrão na propriedade - c #, json, serialização, desserialização

 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 № 1

Bem, 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);