无法使用 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"或"狗"之类的预期值,我看到的是"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);
}

相关内容

  • 没有找到相关文章

最新更新