Desserializando a matriz JSON heterogênea em Lista covariante <> usando JSON.NET
Eu tenho uma matriz JSON contendo objetos de diferentes tipos com propriedades diferentes. Uma das propriedades é chamada "type" e determina o tipo do item da matriz. Aqui está um exemplo dos meus dados:
[{
type : "comment",
text : "xxxx"
}, {
type : "code",
tokens : [{
type : "ref",
data : "m"
}, {
type : "operator",
data : "e"
}
]
}, {
type : "for",
boundLocal : {
type : "local",
name : "i",
kind : "Number"
},
upperBound : {
type : "ref",
tokens : [{
type : "operator",
data : "3"
}, {
type : "operator",
data : "0"
}
]
},
body : [{
type : "code",
tokens : [{
type : "ref",
data : "x"
}
]
}, {
type : "code",
tokens : [{
type : "ref",
data : "y"
}
}
]
]
]
Para mapear esses objetos para minha implementação .Net, defino um conjunto de classes: uma classe base e várias classes filho (com uma hierarquia complexa, com 4 "gerações"). Aqui está apenas um pequeno exemplo dessas classes:
public abstract class TExpression
{
[JsonProperty("type")]
public string Type { get; set; }
}
public class TComment : TExpression
{
[JsonProperty("text")]
public string Text { get; set; }
}
public class TTokenSequence : TExpression
{
[JsonProperty("tokens")]
public List<TToken> Tokens { get; set; }
}
O que eu quero alcançar é ser capaz de desserializar esse array em uma lista genérica covariante, declarada como:
List<TExpression> myexpressions = JsonConvert.DeserializeObject<List<TExpression>>(aststring);
Esta lista deve conter as instâncias de classes filho apropriadas herdadas de TExpression, para que eu possa usar o seguinte código posteriormente no meu código:
foreach(TExpression t in myexpressions)
{
if (t is TComment) dosomething;
if (t is TTokenSequence) dosomethingelse;
}
Como posso alcançá-lo usando JSON.NET