我的问题是我想将 json 对象反序列化为 C# 对象,但诀窍是 C# 对象包含 List< abstract class> 并且这个抽象类是另外 10 个类的超类。
public sealed class SearchAPIResult
{
public string Status;
public SearchAPIQuery Query;
public SearchResults Result;
public SearchAPIResult()
{
}
public SearchAPIResult(string status)
{
Status = status;
}
}
并且SearchAPIResult
是:
public sealed class SearchResults
{
public string TextAnswer;
public List<APIResultWidget> Items;
public SearchResults()
{
Items = new List<APIResultWidget>();
}
}
这里的对象APIResultWidget
是一个抽象类,它继承了大约 10 个类。
问题是 JSON 对象没有自动的东西(如 JSON.NET 中的 typeNameHandling)来引导反序列化器将 10 个派生类的对象转换为哪个对象。相反,对象由两个字段标记:类型和子类型...如下所示
{
"Status": "OK",
"Query": {
"Query": "this is a query",
"QueryLanguage": "EN"
},
"Result": {
"TextAnswer": "This is your text answer",
"Items": [{
"Type": "list",
"SubType": null,
"Title": null,
"Items": []
}, {
"Type": "text",
"Content": "this is some content"
}
]
}
}
在前面的json对象中,Result列表包含两个对象,一个:
{
"Type": "list",
"SubType": null,
"Title": null,
"Items": []
}
它映射到一个 listWidget 类型的类(它继承自 abstractAPIResultWidget
和两个:
{
"Type": "text",
"Content": "this is some content"
}
它映射到textWidget
也继承自同一个抽象类的类
当我使用 Json.NET 方式时
SearchAPIResult converted = (SearchAPIResult)JsonConvert.DeserializeObject(json, typeof(SearchAPIResult), new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
它抛出以下异常:
无法创建 Kngine.API.APIResultWidget 类型的实例。类型是接口或抽象类,不能实例化。路径“Result.Items[0].Type”,第 1 行,位置 136。
我猜有一种自定义方式指出该类型由字段 Type 和 SubType 定义,并为 Converter 提供自定义类型注释器,对吗?