2012-05-09 36 views
3

Json.Net序列化子類中的重寫屬性沒有問題。聲明新的Json.Net序列化繼承屬性不起作用

public override ICollection<Person> Persons { get; set; } 

但是,如果我嘗試在屬性上使用new,則序列化將失敗。沒有例外; Persons只是從未序列化。

public new ICollection<Person> Persons { get; set; } 

這是爲什麼?

(這個例子並沒有太大的意義,我知道,這只是一個例子。我們的目標以後是可以改變的財產public new ICollection<PersonDto> Persons { get; set; }的數據類型)

+0

在哪些類中定義屬性?你在哪個類中定義了一個具有相同名稱的「新」屬性?你會連續什麼課程?如果將該屬性定義爲'new',則無法序列化到基類:基類的Persons屬性(取決於您的代碼的其餘部分)是未初始化的,爲空或爲空集合,而派生類的Persons屬性不會被序列化,因爲它不被視爲基類的一部分。 – CodeCaster

+0

你爲什麼要這樣做?不會爲'Person'使用自定義轉換器更有意義? – svick

+0

@svick我不知道自定義轉換器是什麼。請讓我高興! – FatAlbert

回答

2

我發現了一個簡單的方法來解決這個無需創建一個自定義JsonConverter

如果您將屬性JsonProperty置於其工作的屬性上。

[JsonProperty] 
public new ICollection<PersonDto> Persons { get; set; } 

我不知道爲什麼Json.Net需要這裏的屬性。通常它會將沒有用JsonIgnore裝飾的所有東西序列化。如果有人知道,歡迎您發表評論。

1

如果你想,因爲你想這樣做以指定如何將Person序列化爲JSON,我認爲更好的解決方案是使用自定義JsonConverter。該轉換器可以是這個樣子:

class PersonConverter : JsonConverter 
{ 
    public override void WriteJson(
     JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var person = (Person)value; 
     serializer.Serialize(
      writer, 
      new 
      { 
       Name = person.LastName, 
       Age = (int)(DateTime.Now - person.BirthDate).TotalDays/365 
      }); 
    } 

    public override object ReadJson(
     JsonReader reader, Type objectType, object existingValue, 
     JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(Person); 
    } 
} 

然後,您可以使用這樣的:

JsonConvert.SerializeObject(yourObject, new PersonConverter())