我有一个枚举:
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"或"狗"之类的预期值,我看到的是"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);
}