无法使用Json.NET正确转换为json的枚举

我有一个枚举:

public enum Animal { Dog, Cat, BlackBear } 

我需要将它发送到第三方API。 此API要求我发送的枚举值为小写,偶尔需要下划线。 通常,它们所需的名称与我使用的枚举命名约定不匹配。

使用https://gooddevbaddev.wordpress.com/2013/08/26/deserializing-c-enums-using-json-net/中提供的示例,我尝试使用自定义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); } } 

回到类的属性,我将属性放在Animal上:

 [JsonProperty("animal")] [JsonConverter(typeof(AnimalConverter))] public Animal ZooAnimals { get; set; } 

当我运行该程序时,它似乎完全忽略了JsonConverter,而不是看到像“black_bear”或“dog”这样的预期值,我看到“BlackBear”和“Dog”。 如何让JsonConverter实际执行从枚举值的名称到我指定的字符串的转换,以替换该值?

谢谢!

您不需要编写自己的转换器。 Json.NET的StringEnumConverter将读取EnumMember属性。 如果您将enum更改为此,它将从您想要的值序列化。

 [JsonConverter(typeof(StringEnumConverter))] public enum Animals { [EnumMember(Value = "dog")] Dog, [EnumMember(Value = "cat")] Cat, [EnumMember(Value = "black_bear")] BlackBear } 

(作为一个小注,因为Animals不是一个标志枚举,它应该是单数的 : Animal 。你应该考虑改变它。)

 // Might return null, better to use try catch public static Animals GetEnum(string val) { return (Animals)Enum.Parse(typeof(Animals), val, true); } public static string GetName(Animals an) { return Enum.GetName(typeof(Animals), an); } public static string GetReplace(Animals an) { var get = GetName(an); var tempstr = ""; int getch = 0; foreach (var chr in get.ToCharArray()) { if (chr == chr.ToUpper()) { getch++; // Second up value char if (getch == 2) { tempstr += "_" + chr; } else { tempstr += chr; } } else { tempstr += chr; } } return tempstr; } 

我认为您的ConConvert()实现不正确。 它应该是:

 public override bool CanConvert(Type objectType) { return objectType == typeof(Animals); }