Ne pouvez pas obtenir enum pour convertir en json correctement à l'aide de Json.NET
J'ai un enum:
public enum Animal
{
Dog,
Cat,
BlackBear
}
J'ai besoin de l'envoyer à un tiers de l'API. Cette API nécessite que les valeurs enum-je envoyer être en minuscules et nécessitent parfois des traits de soulignement. En général, les noms ils exigent de ne pas correspondre à la enum convention de nommage que j'utilise.
À l'aide de l'exemple fourni à https://gooddevbaddev.wordpress.com/2013/08/26/deserializing-c-enums-using-json-net/, j'ai essayé d'utiliser un JsonConverter:
public class AnimalConverter : JsonConverter {
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
var animal = (Animal)value;
switch (animal)
{
case Animal.Dog:
{
writer.WriteValue("dog");
break;
}
case Animal.Cat:
{
writer.WriteValue("cat");
break;
}
case Animal.BlackBear:
{
writer.WriteValue("black_bear");
break;
}
}
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
var enumString = (string)reader.Value;
Animal? animal = null;
switch (enumString)
{
case "cat":
{
animal = Animal.Cat;
break;
}
case "dog":
{
animal = Animal.Dog;
break;
}
case "black_bear":
{
animal = Animal.BlackBear;
break;
}
}
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(string);
}
}
De retour dans les propriétés d'une classe, j'ai mis les attributs de l'Animal que donc:
[JsonProperty("animal")]
[JsonConverter(typeof(AnimalConverter))]
public Animal ZooAnimals { get; set; }
Lorsque je lance le programme, cependant, il semble totalement ignorer la JsonConverter et plutôt que de voir les valeurs attendues comme "black_bear" ou "chien", je vois "BlackBear" et "Chien". Comment puis-je obtenir le JsonConverter à réellement faire la conversion à partir du nom de l'enum de la valeur à la chaîne je précise pour remplacer cette valeur avec?
Merci!
- Pouvez-vous produire une courte mais complète du programme, comme par exemple pour LINQPad qui illustre le problème? J'ai écrit un petit LINQPad programme de test et qu'il utilise le convertisseur ici.
- Vous vous référez à
Animal
etAnimals
dans l'exemple de code; pouvez-vous préciser ces deux reportez-vous à votre énumération? Pour ce que ça vaut, j'ai réussi à obtenir votre code de travail à l'aide de l'extrait de code suivant:Zoo zoo = new Zoo { ZooAnimals = Animal.Cat }; string json = JsonConvert.SerializeObject(zoo);
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin d'écrire votre propre convertisseur. Json.NET's
StringEnumConverter
va lire leEnumMember
attribut. Si vous modifiez votreenum
pour cela, il va sérialiser à partir de et pour les valeurs que vous voulez.(Comme une note mineure, depuis
Animals
n'est pas un drapeaux enum, il doit être au singulier:Animal
. Vous devriez envisager de changer à cela.)StringEnumConverter
(voir la source), et de le faire fonctionner avec mon propreEnumMemberAttribute
classe, basé surEnumMemberAttribute
(faut juste la propriété et le constructeur).StringEnumConverter
utiliseEnumMember
et pas la Json.NETJsonProperty
? Parce que je utiliserJsonProperty
partout ailleurs, mais appareantly ne fonctionne pas avec les énumérations..JsonProperty
pour la décrire.[DataContract] public enum Animals....
GetReplace(animal);
Je pense que votre
ConConvert()
mise en œuvre n'est pas correct.Il doit être: