2017-03-22 71 views
1
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字符串看起來像這樣的Json Deserialised不要在物業

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

覆蓋默認值這是我的代碼我在哪裏deserialising jsonStudentData

JsonConvert.DeserializeObject<Student>(jsonStudentData); 

我得到輸出
名稱= ABC, 科目[英語,數學,英語,數學,印地語,社會研究]

,但我想輸出

名稱= ABC, 主題[英語,數學,印地文,社會學]

我在這裏做什麼錯誤。

+0

'公共字符串名稱{;設置;} =「ABCD」;'是無效的'C#'代碼。 – Smartis

+0

相關或重複:[反序列化導致List-Entries的副本](https://stackoverflow.com/q/36314523/3744182)。 – dbc

回答

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基本上說,它應該做的。這是你的SetDefaultSubjects這是增加更多的信息,無論JSON說什麼。

我個人建議你從構造函數中刪除調用SetDefaultSubjects - 可能要添加的CreateStudentWithDefaultSubjects的工廠方法。

您也可能會考慮你的List一組某種(例如HashSet),並讓Subject實施IEquatable<Subject>,使您可以添加重複,他們會被忽略。

0

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

大會:System.Web.Extensions程序(在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); 
+0

非常感謝你對我的這項工作:) – Sachin

+0

如果有幫助,接受答案。這將在未來幫助他人 –