c# - JsonConvert反序列化抽象类数组

标签 c# json.net abstract-class 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; }
}

然后我在建筑物数组中创建了一个街道对象和一些公寓:

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/

相关文章:

c# - 如何正确覆盖对象 [] 的 ReadJson 方法?

c# - 锁定抽象类中的静态或实例变量

c# - 如何在桌面右键菜单中添加项目

c# - 将 List<Property> 转换为 JObject

C# 退出 using() block ,线程仍在作用域对象上运行

c# - 有选择地将实例的属性序列化为 JSON

c++ - 制作一个值类型是 C++ 中的抽象类的映射

Java无法扩展ByteBuffer类

c# - 将 JSON 转换为对象/字典/动态

c# - 如何在客户端部署带有sql server数据库的应用程序