Json Deserialised不会覆盖属性中的默认值

时间:2017-03-22 14:22:59

标签: 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字符串

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

这是我的代码,我正在反序列化jsonStudentData

JsonConvert.DeserializeObject<Student>(jsonStudentData);

我正在收到输出 名字= ABC, 科目[英语,数学,英语,数学,印地语,社会研究]

但我想要输出

姓名= ABC, 科目[英语,数学,印地语,社会研究]

我在这做错了什么。

2 个答案:

答案 0 :(得分: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基本上应该做的事情。无论JSON说什么,这都是您的SetDefaultSubjects添加更多信息。

我个人建议您从构造函数中移除SetDefaultSubjects的调用 - 也许添加CreateStudentWithDefaultSubjects的工厂方法。

您也可以考虑将List设置为某种类型(例如HashSet)并使Subject实施IEquatable<Subject>,以便您可以添加重复项,并且它们可以我会被忽略。

答案 1 :(得分:0)

或者,您可以使用C#函数进行反序列化。

程序集:System.Web.Extensions(在System.Web.Extensions.dll中)

strncat(dateTime, incoming + 3, 2);