C#:使用继承反序列化 Json

C#: Deserialize Json using Inheritance

我有以下一段代码创建一个对象并写入一个文件并从该文件中读取并尝试将其反序列化为同一个对象(代码可能看起来毫无意义但我将大代码简化为一个小示例突出问题的代码):

internal class Program
{
    private static void Main(string[] args)
    {
        string filePath = Path.Combine(@"C:\Users\user1", "TestFile.txt");

        TemplateA templateA = new TemplateA();
        templateA.objectsList = new List<TemplateX>();

        TemplateX templateX = new TemplateX();
        templateX.property1 = "Sample Value X1";

        TemplateY templateY = new TemplateY();
        templateY.property1 = "Sample value Y1";
        templateY.property2 = "Sample value Y2";

        templateA.objectsList.Add(templateX);
        templateA.objectsList.Add(templateY);

        string json = JsonConvert.SerializeObject(templateA, Formatting.Indented);
        File.WriteAllText(filePath, json);

        string jsonString = File.ReadAllText(filePath);
        TemplateA templateACopy = JsonConvert.DeserializeObject<TemplateA>(jsonString);
    }
}

internal class TemplateA
{
    [JsonProperty(PropertyName = "objectsList")]
    public List<TemplateX> objectsList;
}


internal class TemplateX
{
    [JsonProperty(PropertyName = "property1")]
    public string property1;
}

internal class TemplateY : TemplateX
{
    [JsonProperty(PropertyName = "property2")]
    public string property2;
}

当我将写入 TextFile.txt 的同一对象 templateA 读回到 templateACopy 时,它丢失了 属性 Y2("Sample value Y2") 的信息。那就是 templateACopy 有:

这可以通过手动检查字符串是否包含 Class TemplateY 元素并使用适当的对象类型反序列化来更正。但是有没有办法自动检测对象是继承类型并通过 Newtonsoft JsonConvert 的函数本身反序列化为适当的对象? (之前不知道 json 字符串是否具有 TemplateX 或 TemplateY 类型的对象。这可以在运行时更改。)

使用 List<baseType> 的自定义设置,通过为对象指定 TypeNameHandling 来获取序列化的派生类型:

   var settings = new JsonSerializerSettings()
   {
      TypeNameHandling = TypeNameHandling.Objects
   };

   string json = JsonConvert.SerializeObject(templateA, settings);

   TemplateA templateACopy = 
            JsonConvert.DeserializeObject<TemplateA>(jsonString, settings);