26

我有一个枚举:

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 实际执行从枚举值的名称到我指定替换该值的字符串的转换?

谢谢!

4

3 回答 3

75

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

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

(作为一个小提示,由于Animals不是标志枚举,它应该是单数: Animal。您应该考虑将其更改为此。)

于 2013-11-04T12:59:30.887 回答
0
// 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;
}
于 2013-11-04T12:41:20.487 回答
0

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

public override bool CanConvert(Type objectType)
{
    return objectType == typeof(Animals);
}
于 2013-11-04T12:59:51.217 回答