Sto cercando di spostare del codice per utilizzare ASP.NET MVC Web API generato dati JSON invece di SOAP Xml.NewtonSoft.Json Serializza e deserializza la classe con la proprietà di tipo IEnumerable <ISomeInterface>
ho incontrato un problema con la serializzazione e deserializzazione le proprietà di tipo:
IEnumerable<ISomeInterface>.
Ecco un semplice esempio:
public interface ISample{
int SampleId { get; set; }
}
public class Sample : ISample{
public int SampleId { get; set; }
}
public class SampleGroup{
public int GroupId { get; set; }
public IEnumerable<ISample> Samples { get; set; }
}
}
posso serializzare le istanze di SampleGroup facilmente con:
var sz = JsonConvert.SerializeObject(sampleGroupInstance);
Tuttavia, la deserializzazione corrispondente non riesce:
JsonConvert.DeserializeObject<SampleGroup>(sz);
con questo messaggio di eccezione:
"Impossibile creare un'istanza di tipo JsonSerializationExample.ISample. Tipo è un interfaccia o classe astratta e non può essere instantated "
Se io traggo un JsonConverter posso decorare la mia proprietà come segue:.
[JsonConverter(typeof (SamplesJsonConverter))]
public IEnumerable<ISample> Samples { get; set; }
Ecco il JsonConverter:
public class SamplesJsonConverter : JsonConverter{
public override bool CanConvert(Type objectType){
return (objectType == typeof (IEnumerable<ISample>));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer){
var jA = JArray.Load(reader);
return jA.Select(jl => serializer.Deserialize<Sample>(new JTokenReader(jl))).Cast<ISample>().ToList();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer){
... What works here?
}
}
Questo convertitore risolve il problema della deserializzazione ma non riesco a capire come codificare il metodo WriteJson per far funzionare nuovamente la serializzazione
Qualcuno può dare una mano?
Si tratta di un modo "corretto" per risolvere il problema in primo luogo?
In aggiunta alle risposte seguenti, è possibile sovrascrivere ['CanWrite'] (http://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_JsonConverter_CanWrite.htm) e restituire' false'. Vedi [Come utilizzare la serializzazione predefinita in un JsonConverter personalizzato] (https://stackoverflow.com/questions/29616596/how-to-use-default-serialization-in-a-custom-jsonconverter/29616648#29616648). – dbc