Подтвердить что ты не робот

Невозможно получить перечисление для правильного преобразования в json с помощью Json.NET

У меня есть перечисление:

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 фактически выполнить преобразование из имени значения enum в строку, которую я указываю, чтобы заменить это значение на?

Спасибо!

4b9b3361

Ответ 1

Вам не нужно писать собственный конвертер. 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. подумайте об изменении этого вопроса.)

Ответ 2

// 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;
}

Ответ 3

Я думаю, что ваша реализация ConConvert() неверна. Это должно быть:

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