【发布时间】:2013-11-04 12:37:13
【问题描述】:
我有一个枚举:
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 实际执行从枚举值的名称到我指定替换该值的字符串的转换?
谢谢!
【问题讨论】:
-
你能否制作一个简短但完整的程序,例如 LINQPad 来演示问题?我写了一个小的 LINQPad 程序来测试,它在这里使用了转换器。
-
您在代码示例中引用了
Animal和Animals;你能澄清这两个都指你的枚举吗?对于它的价值,我设法使用以下 sn-p 使您的代码正常工作:Zoo zoo = new Zoo { ZooAnimals = Animal.Cat }; string json = JsonConvert.SerializeObject(zoo);