我的问题是我想反序列化JSON对象到C#对象,但诀窍是,C#对象包含列表<抽象类>这个抽象类是一个超类的另有10个班。反序列化JSON对象,以多态C#对象,而typeNameHandling
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对象
,结果列表包含两个对象,一个:
{
"Type": "list",
"SubType": null,
"Title": null,
"Items": []
}
映射到类类型的listWidget(其从抽象APIResultWidget
和两个继承:
{
"Type": "text",
"Content": "this is some content"
}
映射到textWidget
类也从相同的abstra继承CT类
SearchAPIResult converted = (SearchAPIResult)JsonConvert.DeserializeObject(json, typeof(SearchAPIResult), new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
它抛出以下异常
:
无法创建类型Kngine.API.APIResultWidget的一个实例。 Type是一个接口或抽象类,不能实例化。 Path'Result.Items [0] .Type',line 1,position 136.
我猜想有一种自定义的方式指出该类型是由字段Type和SubType定义的,并给出Converter那个自定义类型注释器,对吗?
APIResultWidget只是一个抽象类,它实际上是空的 – SKandeel 2013-05-13 15:11:09