栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

我如何在json反序列化期间忽略未知的枚举值?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

我如何在json反序列化期间忽略未知的枚举值?

您可以使用custom解决此问题

JsonConverter
。这是我使用
StringEnumConverter
来自Json.Net
的类中的一些片段组合而成的。它应该使您能够灵活地以各种方式处理事情。运作方式如下:

  • 如果在JSON中找到的值与枚举匹配(作为字符串或整数),则使用该值。(如果值是整数,并且有多个可能的匹配项,则使用第一个。)
  • 否则,如果枚举类型为可为空,则将该值设置为null。
  • 否则,如果枚举具有一个名为“未知”的值,则将使用该值。
  • 否则,将使用枚举的第一个值。

这是代码。随时更改它以满足您的需求。

class TolerantEnumConverter : JsonConverter{    public override bool CanConvert(Type objectType)    {        Type type = IsNullableType(objectType) ? Nullable.GetUnderlyingType(objectType) : objectType;        return type.IsEnum;    }    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)    {        bool isNullable = IsNullableType(objectType);        Type enumType = isNullable ? Nullable.GetUnderlyingType(objectType) : objectType;        string[] names = Enum.GetNames(enumType);        if (reader.TokenType == JsonToken.String)        { string enumText = reader.Value.ToString(); if (!string.IsNullOrEmpty(enumText)) {     string match = names         .Where(n => string.Equals(n, enumText, StringComparison.OrdinalIgnoreCase))         .FirstOrDefault();     if (match != null)     {         return Enum.Parse(enumType, match);     } }        }        else if (reader.TokenType == JsonToken.Integer)        { int enumVal = Convert.ToInt32(reader.Value); int[] values = (int[])Enum.GetValues(enumType); if (values.Contains(enumVal)) {     return Enum.Parse(enumType, enumVal.ToString()); }        }        if (!isNullable)        { string defaultName = names     .Where(n => string.Equals(n, "Unknown", StringComparison.OrdinalIgnoreCase))     .FirstOrDefault(); if (defaultName == null) {     defaultName = names.First(); } return Enum.Parse(enumType, defaultName);        }        return null;    }    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)    {        writer.Writevalue(value.ToString());    }    private bool IsNullableType(Type t)    {        return (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));    }}

这是一个演示,它使用几个不同的枚举使转换器按照自己的步调前进(一个具有“未知”值,另一个没有):

[JsonConverter(typeof(TolerantEnumConverter))]enum Status{    Ready = 1,    Set = 2,    Go = 3}[JsonConverter(typeof(TolerantEnumConverter))]enum Color{    Red = 1,    Yellow = 2,    Green = 3,    Unknown = 99}class Foo{    public Status NonNullableStatusWithValidStringValue { get; set; }    public Status NonNullableStatusWithValidIntValue { get; set; }    public Status NonNullableStatusWithInvalidStringValue { get; set; }    public Status NonNullableStatusWithInvalidIntValue { get; set; }    public Status NonNullableStatusWithNullValue { get; set; }    public Status? NullableStatusWithValidStringValue { get; set; }    public Status? NullableStatusWithValidIntValue { get; set; }    public Status? NullableStatusWithInvalidStringValue { get; set; }    public Status? NullableStatusWithInvalidIntValue { get; set; }    public Status? NullableStatusWithNullValue { get; set; }    public Color NonNullableColorWithValidStringValue { get; set; }    public Color NonNullableColorWithValidIntValue { get; set; }    public Color NonNullableColorWithInvalidStringValue { get; set; }    public Color NonNullableColorWithInvalidIntValue { get; set; }    public Color NonNullableColorWithNullValue { get; set; }    public Color? NullableColorWithValidStringValue { get; set; }    public Color? NullableColorWithValidIntValue { get; set; }    public Color? NullableColorWithInvalidStringValue { get; set; }    public Color? NullableColorWithInvalidIntValue { get; set; }    public Color? NullableColorWithNullValue { get; set; }}class Program{    static void Main(string[] args)    {        string json = @"        { ""NonNullableStatusWithValidStringValue"" : ""Set"", ""NonNullableStatusWithValidIntValue"" : 2, ""NonNullableStatusWithInvalidStringValue"" : ""Blah"", ""NonNullableStatusWithInvalidIntValue"" : 9, ""NonNullableStatusWithNullValue"" : null, ""NullableStatusWithValidStringValue"" : ""Go"", ""NullableStatusWithValidIntValue"" : 3, ""NullableStatusWithNullValue"" : null, ""NullableStatusWithInvalidStringValue"" : ""Blah"", ""NullableStatusWithInvalidIntValue"" : 9, ""NonNullableColorWithValidStringValue"" : ""Green"", ""NonNullableColorWithValidIntValue"" : 3, ""NonNullableColorWithInvalidStringValue"" : ""Blah"", ""NonNullableColorWithInvalidIntValue"" : 0, ""NonNullableColorWithNullValue"" : null, ""NullableColorWithValidStringValue"" : ""Yellow"", ""NullableColorWithValidIntValue"" : 2, ""NullableColorWithNullValue"" : null, ""NullableColorWithInvalidStringValue"" : ""Blah"", ""NullableColorWithInvalidIntValue"" : 0,        }";        Foo foo = JsonConvert.DeserializeObject<Foo>(json);        foreach (PropertyInfo prop in typeof(Foo).GetProperties())        { object val = prop.GetValue(foo, null); Console.WriteLine(prop.Name + ": " +        (val == null ? "(null)" : val.ToString()));        }    }}

输出:

NonNullableStatusWithValidStringValue: SetNonNullableStatusWithValidIntValue: SetNonNullableStatusWithInvalidStringValue: ReadyNonNullableStatusWithInvalidIntValue: ReadyNonNullableStatusWithNullValue: ReadyNullableStatusWithValidStringValue: GoNullableStatusWithValidIntValue: GoNullableStatusWithInvalidStringValue: (null)NullableStatusWithInvalidIntValue: (null)NullableStatusWithNullValue: (null)NonNullableColorWithValidStringValue: GreenNonNullableColorWithValidIntValue: GreenNonNullableColorWithInvalidStringValue: UnknownNonNullableColorWithInvalidIntValue: UnknownNonNullableColorWithNullValue: UnknownNullableColorWithValidStringValue: YellowNullableColorWithValidIntValue: YellowNullableColorWithInvalidStringValue: (null)NullableColorWithInvalidIntValue: (null)NullableColorWithNullValue: (null)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/432953.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号