Comment décorer JSON.NET SsortingngEnumConverter

Je consum une api qui renvoie des valeurs de chaîne comme ceci. some-enum-value

J’essaie de mettre ces valeurs dans une énumération, car le défaut SsortingngEnumConverter ne fait pas le travail. J’essaie de décorer ce convertisseur avec une logique supplémentaire. Comment puis-je m’assurer que les valeurs sont correctement désérialisées?

Le code suivant est mon essai pour effectuer ce travail. Cependant, le reader = new JsonTextReader(new SsortingngReader(cleaned)); ligne reader = new JsonTextReader(new SsortingngReader(cleaned)); brise le tout depuis la base.ReadJson ne peut pas reconnaître la chaîne en tant que JSON.

Existe-t-il un meilleur moyen de le faire sans avoir à implémenter toute la logique existante dans SsortingngEnumConverter? Comment réparer mon approche?

 public class BkSsortingngEnumConverter : SsortingngEnumConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Ssortingng) { var enumSsortingng = reader.Value.ToSsortingng(); if (enumSsortingng.Contains("-")) { var cleaned = enumSsortingng.Split('-').Select(FirstToUpper).Aggregate((a, b) => a + b); reader = new JsonTextReader(new SsortingngReader(cleaned)); } } return base.ReadJson(reader, objectType, existingValue, serializer); } private static ssortingng FirstToUpper(ssortingng input) { var firstLetter = input.ToCharArray().First().ToSsortingng().ToUpper(); return ssortingng.IsNullOrEmpty(input) ? input : firstLetter + ssortingng.Join("", input.ToCharArray().Skip(1)); } } 

J’ai résolu le problème en ajoutant des atsortingbuts EnumMember à mes valeurs enum. Le SsortingngEnumConverter de Json.NET par défaut SsortingngEnumConverter parfaitement ces atsortingbuts.

Exemple:

 public enum MyEnum { [EnumMember("some-enum-value")] SomeEnumValue, Value, [EnumMember("some-other-value")] SomeOtherValue } 

Veuillez noter que vous devez uniquement spécifier les atsortingbuts en cas de tirets ou d’autres caractères spéciaux que vous ne pouvez pas utiliser dans votre enum. Les minuscules majuscules sont traitées par SsortingngEnumConverter . Ainsi, si le service renvoie une valeur telle que someenumvalue utilisez-la comme ceci dans la énumération Someenumvalue . Si vous préférez SomeEnumValue vous devez utiliser l’atsortingbut EnumMember . someEnumValue le service le renvoie comme ceci, someEnumValue vous pouvez simplement l’utiliser comme SomeEnumValue : SomeEnumValue (il fonctionne par défaut lorsque vous utilisez la propriété CamelCaseText).

Vous pouvez facilement spécifier vos convertisseurs et d’autres parameters dans JsonSerializerSettings .

Voici un exemple des parameters que j’utilise moi-même.

 new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), Converters = new List { new SsortingngEnumConverter { CamelCaseText = true } }, NullValueHandling = NullValueHandling.Ignore }; 

Vous pouvez également utiliser ce code:

 [JsonConverter(typeof(SsortingngEnumConverter))] public enum ResposeStatus { [EnumMember(Value = "success value")] Success, [EnumMember(Value = "fail value")] Fail, [EnumMember(Value = "error value")] Error }; 

Lors de la sérialisation de JsonConvert.Serialize() , utilisera le texte EnumMember dans EnumMember .

Aussi, vous pouvez utiliser cette méthode:

 public static ssortingng GetDescription(this Enum member) { if (member.GetType().IsEnum == false) throw new ArgumentOutOfRangeException(nameof(member), "member is not enum"); var fieldInfo = member.GetType().GetField(member.ToSsortingng()); if (fieldInfo == null) return null; var atsortingbutes = fieldInfo.GetCustomAtsortingbutes(false).ToList(); return atsortingbutes.Any() ? atsortingbutes.FirstOrDefault()?.Description : member.ToSsortingng(); } 

ou

 public static ssortingng GetDescription(this object member) { var type = member.GetType(); var atsortingbutes = type.GetCustomAtsortingbutes(false).ToList(); return atsortingbutes.Any() ? atsortingbutes.FirstOrDefault()?.Description : member.GetType().Name; } 

et enum devrait avoir l’atsortingbut descsortingption . Comme ça:

 public enum MyEnum { [Description("some-enum-value")] And, [Description("some-enum-value")] Or } 

Et que vous pouvez utiliser votre enum comme ceci:

 MyEnum.GetDescription(); //return "some-enum-value"