JsonConvert 反序列化一组抽象类

Sun*_*Sun 2 c# abstract-class json.net json-deserialization

假设我有以下类结构(Building 是一个抽象类):

public class Street
{
    public string StreetName { get; set; }

    public Building[] Buildings { get; set; }
}

public abstract class Building
{
    public string Name { get; set; }
}

public class House : Building
{
    public int Floors { get; set; }
}

public class Flat : Building
{
    public int WhichFloor { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,我在建筑物阵列中创建了一个带有一些公寓的街道对象:

Flat f1 = new Flat { Name = "Flat 1", WhichFloor = 1 };
Flat f2 = new Flat { Name = "Flat 2", WhichFloor = 2 };

Street street = new Street
{
    StreetName = "Street Name",
    Buildings = new[] { f1, f2 }
};
Run Code Online (Sandbox Code Playgroud)

使用 JsonConvert 我然后序列化对象:

var toJson = JsonConvert.SerializeObject(street);
Run Code Online (Sandbox Code Playgroud)

现在我想将 json 转换回街道对象:

var fromJson = JsonConvert.DeserializeObject<Street>(toJson);
Run Code Online (Sandbox Code Playgroud)

这失败并出现以下错误:

“无法创建 Building 类型的实例。类型是接口或抽象类,无法实例化。路径 'Buildings[0].WhichFloor'”

我如何告诉 JsonConvert 类建筑物应该是一组公寓?

Fai*_*ani 7

根据@Evk 的共享链接,您应该在序列化和反序列化时尝试设置TypeNameHandlingTypeNameHandling.Auto

var toJson = JsonConvert.SerializeObject(street, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Auto
});


var fromJson = JsonConvert.DeserializeObject<Street>(toJson, new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Auto
});
Run Code Online (Sandbox Code Playgroud)