使用Json.Net进行C#枚举反序列化:将值转换为类型时出错

米娜·萨米(Mina Samy)

我正在使用Json.NET对一些JSON API进行序列化/反序列化。

API响应具有一些整数值,这些整数值映射到应用程序中定义的Enum。

枚举是这样的:

public enum MyEnum
    {
        Type1,
        Type2,
        Type3
}

并且json API响应具有以下内容:

{
        "Name": "abc",
        "MyEnumValue":"Type1"
}

有时,API会为我的枚举中未定义的MyEnumValue字段返回一个值,如下所示:

{
            "Name": "abc",
            "MyEnumValue":"Type4"
    }

抛出一个异常:

将值“ Type4”转换为“ MyEnum”类型时出错

有没有一种方法可以通过分配默认值或避免应用程序崩溃的方法来处理此错误?

伊利亚·迪莫夫(Ilija Dimov)

假设我们有以下json字符串:

[
    {
        "Name": "abc",
        "MyEnumValue": "Type1"
    },
    {
        "Name": "abcd",
        "MyEnumValue": "Type2"
    },
    {
        "Name": "abcde",
        "MyEnumValue": "Type3"
    }    ,
    {
        "Name": "abcdef",
        "MyEnumValue": "Type4"
    }
]

以及以下类和枚举:

public class MyClass
{
    public string Name { get; set; }

    public MyEnum MyEnumValue { get; set; }
}

public enum MyEnum
{
    Type1,
    Type2,
    Type3
}

可以注意到,json字符串数组包含无法正确映射到的项目(最后一个)MyEnum为了避免反序列化错误,您可以使用以下代码片段:

static void Main(string[] args)
{         
    var serializationSettings = new JsonSerializerSettings
    {
        Error = HandleDeserializationError
    };

    var lst = JsonConvert.DeserializeObject<List<MyClass>>(jsonStr, serializationSettings);
}

public static void HandleDeserializationError(object sender, ErrorEventArgs errorArgs)
{
    errorArgs.ErrorContext.Handled = true;
    var currentObj = errorArgs.CurrentObject as MyClass;

    if (currentObj == null) return;
    currentObj.MyEnumValue = MyEnum.Type2;            
}

其中jsonStr变量是上面发布的json字符串。在上面的代码示例中,如果MyEnumValue无法正确解释,则将其设置为默认值Type2

示例:https//dotnetfiddle.net/WKd2Lt

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用XmlSerializer在C#中反序列化期间将xml属性转换为自定义对象

反序列化JSON对象时,是否可以将属性名称转换为小写?

使用Json.NET对混合类型的数组进行序列化/反序列化

使用Json.net使用接口值反序列化复杂的嵌套字典类型

如何使用字符串枚举转换器进行JSON反序列化?

使用C#进行JSON反序列化的问题

使用JSON.NET反序列化JSON-无法反序列化,因为该类型需要JSON数组C#

如何使用JSON.net C#反序列化复杂的JSON

Json.Net可以将反序列化的对象转换为Json中嵌入的类型吗?

在C#之后反序列化Python中的Json文件(用于从byte []转换为图像)

将字符串转换为类型时出错-Newtonsoft JSON反序列化

Newtonsoft.Json-反序列化自定义类型时引发DeserializeObject:将值“ somestring”转换为CustomType时出错

严格设置Spring Boot JSON枚举反序列化,因此它不会默默地将无效值转换为null

在C#中使用数据协定进行Xml反序列化期间出错

在C#中使用Newtonsoft Json.NET反序列化JSON

使用带有JSON.NET C#的内部类的json文件反序列化

C#Json反序列化异常(“将值“ id”转换为类型'Eng_Tab.JsonData'时出错。路径'[0]',第1行,位置5”。)

直接将Json.net JSON文件反序列化为C#字典类型?

使用C#反序列化XML时出错

在 C# 中反序列化 (.net json) 或序列化 (XmlSerializer) 期间填充 NULL 值

在 C# 中反序列化 JSON 值数组

反序列化/将 JSON 转换为 C# 列表

使用 json.net/RestSharp 在 C# 中使用元数据反序列化 JSON

使用 Newtonsoft.Json 反序列化 C# 对象时出错:将值“xxx”转换为类型“System.String[]”时出错

C# 类型安全的 JSON 行反序列化

反序列化对象数组:无法将 JSON 值转换为 System.String[]

将 JSON 数组反序列化为 List<T> C# 时出错

尝试从 C# 中的 API 调用反序列化 JSON 对象时出错。(货币兑换)

如何将 json 值转换为小写 - 反序列化