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

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 に答える