Possiedo un array JSON contenente oggetti di tipi diversi con proprietà diverse. Una delle proprietà è chiamata "tipo" e determina il tipo della voce dell'array. Ecco un esempio dei miei dati:Deserializzazione di un array JSON eterogeneo in Elenco covariante <> utilizzando JSON.NET
[{
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"
}
}
]
]
]
Per mappare gli oggetti alla mia implementazione .Net io definisco un insieme di classi: una classe di base e diverse classi figlie (con una gerarchia complessa, avendo 4 "generazioni") . Qui è solo un piccolo esempio di queste classi:
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; }
}
Quello che voglio raggiungere è quello di essere in grado di deserializzare questo array in un elenco generico covariante, dichiarato come:
List<TExpression> myexpressions = JsonConvert.DeserializeObject<List<TExpression>>(aststring);
La lista deve contenere le istanze di opportune classi figlie ereditano da TExpression, in modo da poter utilizzare il seguente codice in seguito nel mio codice:
foreach(TExpression t in myexpressions)
{
if (t is TComment) dosomething;
if (t is TTokenSequence) dosomethingelse;
}
Come posso raggiungerlo usando JSON.NET?
Eventuali duplicati di https://stackoverflow.com/questions/35182949/deserialize-json-string-depending- on-type/44650012 – manuc66