首页 > 解决方案 > Json.Net - 在 c# 中反序列化为枚举

问题描述

我正在使用 Json.Net 反序列化

我有一个具有这种类型枚举属性的 ac# 类:

public enum MyEnum {
  House,   
  Cat,
  Dog
 }

我拥有的Json:

    "MyEnum ": "House",
    "MyEnum ": "Cat",
    "MyEnum ": "Doc<woof>"

HouseCat反序列化,但Dog<woof>当然不会。如何让 Json.Net 忽略或处理woof

标签: c#jsonjson.net

解决方案


您将需要定义一个自定义 JsonConverter。这可能看起来像这样:

class MyEnumConverter : JsonConverter<MyEnum>
{
  public override MyEnum ReadJson(JsonReader reader, Type objectType, MyEnum existingValue, bool hasExistingValue, JsonSerializer serializer)
  {
    var token = reader.Value as string ?? reader.Value.ToString();
    var stripped = Regex.Replace(token, @"<[^>]+>", string.Empty);
    if (Enum.TryParse<MyEnum>(stripped, out var result))
    {
      return result;
    }
    return default(MyEnum);
  }

  public override void WriteJson(JsonWriter writer, MyEnum value, JsonSerializer serializer)
  {
    writer.WriteValue(value.ToString());
  }
}

然后用[JsonConverter]属性装饰你的枚举:

[JsonConverter(typeof(MyEnumConverter))]
enum MyEnum
{
  House,
  Dog,
  Cat,
}

推荐阅读