2016-01-28 43 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

相关问题