ho un'enumerazione definita con C#, dove sto memorizzare i suoi valori come caratteri, come questo:Deserialize carattere JSON come enumerazione
public enum CardType
{
Artist = 'A',
Contemporary = 'C',
Historical = 'H',
Musician = 'M',
Sports = 'S',
Writer = 'W'
}
Sto tentando di deserializzare utilizzando JSON.NET, ma l'incoming JSON è stato scritto utilizzando il valore cHAR (stringa) invece del valore int dell'enumerazione, in questo modo:
[{"CardType","A"},{"CardType", "C"}]
E 'possibile definire un qualche tipo di convertitore che mi permetterà di analizzare manualmente il carattere al enum valore?
Ho provato a creare un JsonConverter, ma non sono sicuro di come farlo, pur applicandolo solo a questa proprietà e non all'intero oggetto analizzato. ecco cosa ho provato:
public class EnumerationConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
int value = serializer.Deserialize<int>(reader);
return (CardType)value;
}
public override bool CanConvert(Type objectType)
{
return objectType.IsSubclassOf(typeof(string));
}
}
La logica potrebbe essere sbagliato e posso risolvere questo, ma il problema è ReadJson() non viene chiamato a tutti.
CanConvert è, ma sembra di essere chiamato per ogni proprietà, non solo quella di proprietà ho definito per:
public class Card
{
private CardType type;
[JsonConverter(typeof(EnumerationConverter))]
public CardType Type
{
get { return type; }
set { type = value; }
}
}
Sono sicuro che ho fatto questo in modo non corretto, ma sto avendo problemi a trovare la documentazione su come fare questo per un singolo campo ...
Cosa mi manca?
Puoi pubblicare una classe campione che ha la proprietà 'CardType' dove il deserilization fallisce? – nemesv
puoi pubblicare l'enum completo. Sono sicuro che non puoi dichiarare enum come hai definito sopra – dharam
la classe in cui è deserializzata ha solo una proprietà CardType per ricevere il valore deserializzato, non c'è niente oltre alla dichiarazione. Per quanto riguarda il valore enum, questa è effettivamente la definizione completa dell'ENUM. la classe Card ha una proprietà di tipo CardType per la memorizzazione del valore di tipo enumerato. – SelAromDotNet