仅使用 Newtonsoft Json.NET 序列化派生类型

本文关键字:序列化 派生 类型 NET Json Newtonsoft | 更新日期: 2023-09-27 18:32:17

是否有任何 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;}
}

仅使用 Newtonsoft Json.NET 序列化派生类型

像这样的问题通常反映了模型设计的问题,但是,做你想做的事情的一种方法是摆脱继承; 您可以尝试将对象转换为动态,然后序列化动态对象:

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

请参阅此链接以获取更多信息