是否有任何 JsonSerializerSettings 可用于仅序列化派生类型。
例如,假设我有以下两个类。当我序列化员工对象时,结果 json 应该只包含员工的属性,而不是 person 类。
public class Person
{
public string Name { get; set; }
}
public class Employee : Person
{
public DateTime JoiningDate { get; set; }
public string EmployeeId { get; set;}
}
像这样的问题通常反映了模型设计的问题,但是,做你想做的事情的一种方法是摆脱继承; 您可以尝试将对象转换为动态,然后序列化动态对象:
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)
这样,您可以将其用于任何类型,并筛选属性以在帮助程序类中进行序列化。例如,您可以检查属性属性并决定是否应将其添加到动态对象中。
您可以使用自定义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
请参阅此链接以获取更多信息