2016-01-28 68 views
1

是否有任何JsonSerializerSettings可用於序列化僅派生類型。使用Newtonsoft Json.NET僅序列化派生類型

例如考慮我有以下兩類。當我序列化Employee對象時,結果json應該只包含employee而不是person類的屬性。

public class Person 
{ 
    public string Name { get; set; } 
} 

public class Employee : Person 
{ 
    public DateTime JoiningDate { get; set; } 
    public string EmployeeId { get; set;} 
} 
+2

您是否總是希望'Name'在您序列化子類型的Person時被忽略?如果是這樣,只是一個簡單的忽略屬性應該做的伎倆。 – mason

+0

這只是我給出的一個例子。但我真正的基類有多個屬性和深入的對象圖。所以只是不想序列化任何基類屬性。 – Saran

+2

按照梅森建議,使用JsonIgnore屬性標記基類中的屬性。這應該夠了吧。 – EventHorizon

回答

2

問題,如這些信息通常反映與模型設計的問題但是,執行你想做的事情的一種方法是擺脫繼承,你可以嘗試類似將對象轉換爲動態對象,然後序列化動態對象:

class MyJson 
{ 
public static string SerializeObject<T>(T obj, bool ignoreBase) 
{ 
    if(!ignoreBase) 
    { 
    return JsonConvert.SerializeObject(obj); 
    } 

    var myType = typeof(T); 
    var props = myType.GetProperties().Where(p => p.DeclaringType == myType).ToList(); 

    var x = new ExpandoObject() as IDictionary<string, Object>; 
    props.ForEach(p => x.Add(p.Name, p.GetValue(obj, null))); 

    return JsonConvert.SerializeObject(x); 
} 
} 

這樣稱呼它

MyJson.SerializeObject<Employee>(e, true) 

這樣你就可以將其用於任何類型和過濾性能序列化,但是你想在輔助類。例如,您可以檢查屬性屬性並決定是否應將其添加到動態對象中。

1

爲此,您可以使用自定義JsonConverter。請參閱下面的基本版本爲您的目的。

public class PersonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     if (objectType == typeof(Employee)) 
      return true; 

     return false; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     return ""; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     JToken t = JToken.FromObject(value); 

     if (t.Type != JTokenType.Object) 
     { 
      t.WriteTo(writer); 
     } 
     else 
     { 
      JObject o = (JObject)t; 

      o.Remove("Name"); //currently the property name is hardcoded. You could enhance this to remove any property you like 

      o.WriteTo(writer); 
     } 
    } 
} 

創建JsonConverter您可以使用像下面反序列化過程後,

var des = JsonConvert.SerializeObject(e, new PersonConverter()); 
//e is the Person instance we want to convert and PersonConverter is the custom converter 
//we use of serialization 

請參閱本link查找有關此

+0

謝謝。這是很好的解決方案。但仍然認爲比這更簡單。 – Saran

+0

謝謝!上面代碼中唯一需要調整的就是要找到需要刪除的屬性名稱的方式。根據您的要求,您必須決定配置屬性名稱的最佳方法。 – Martin

相關問題