假设我有以下类结构(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; }
}
然后我在建筑物数组中创建了一个街道对象和一些公寓:
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 }
};
然后使用 JsonConvert 序列化对象:
var toJson = JsonConvert.SerializeObject(street);
现在我想将 json 转换回街道对象:
var fromJson = JsonConvert.DeserializeObject<Street>(toJson);
失败并出现以下错误:
“无法创建 Building 类型的实例。类型是接口(interface)或抽象类,无法实例化。路径‘Buildings[0].WhichFloor’”
我如何告诉 JsonConvert 类 Buildings 应该是一组公寓?
最佳答案
根据@Evk 的共享链接,您应该在序列化和反序列化时尝试将 TypeNameHandling
设置为 TypeNameHandling.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
});
关于c# - JsonConvert反序列化抽象类数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48910547/