我正在使用 System.Net.Http.HttpClient(目前在 NuGet中可用的版本)从 json 格式的服务中检索数据。数据大致如下:
{
"schema": "Listing",
"data": {
"key": "28ba648c-de24-45d4-a7d9-70f810cf5438",
"children": [{
"kind": "type1",
"data": {
"body": "Four score and seven years ago...",
"parent_id": "2qh3l",
"report_count": 0,
"name": "c4j6yeh"
}
}, {
"kind": "type3",
"data": {
"domain": "abc.def.com",
"flagged": true,
"category": "news",
"saved": false,
"id": "t3dz0",
"created": 1335998011.0
}
}]
}
}
我用来HttpContentExtensions.ReadAsAsync<T>
将该 json 字符串反序列化为对象图。类型定义大致如下:
public class Response
{
public String schema { get;set; }
public ListingData data { get;set; }
}
public class ListingData
{
public string key { get;set; }
public List<OneItem> children { get;set; }
}
问题是:我希望物品的类型children
因kind
物业而异。如果kind
是“type1”,那么我想反序列化一个对象......让我们称之为Type1
。如果kind
是“type3”那么我想要一个类型的对象Type3
。
现在,我可以反序列化 aList<Type1>
或 a List<Type3>
,但我不知道如何告诉反序列化逻辑来区分两者。
我可以将“type1”数据对象和“type3”数据对象的所有属性合并到一个.NET 类型中。但是属性的数量足够大,这会变得混乱。
如果 JSON(在这种情况下data
)中的属性名称不同,我可以使用它来区分。例如,如果数据如下所示:
"children": [{
"kind": "type1",
"t1data": { ... }
}, {
"kind": "type3",
"t3data": { ... }
}]
...然后我可以在.NET中做这样的事情:
public class OneItem
{
public string kind { get;set; }
public Type1 t1data { get;set; }
public Type3 t3data { get;set; }
}
但我的数据架构看起来不像那样。
是否可以根据数据的内容来选择反序列化的类型?换句话说,查看一个属性(在本例中为kind
)的值以确定如何反序列化另一个属性(在本例中为data
)的内容。
或者是否可以在 ReadAsAsync 尝试反序列化之前注入作用于 JSON 的过滤器或转换器?
如果是这样,如何?