如果已删除枚举项,则将Json反序列化回列表或枚举会导致错误

时间:2018-03-02 16:51:30

标签: c# json serialization json.net

说我有以下枚举:

public enum Test
{
    item1 = 1,
    item2 = 2,
    item3 = 3
}

我使用JsonConvert.SerializeObject将所有这些枚举添加到列表中。然后,我有一个JSON字符串,如下所示:

["item1","item2","item3"]

然后我想将JSON反序列化为枚举列表。所以:

List<Test> list = JsonConvert.DeserializeObject<List<Test>>(json string);

这很有效。

但是,如果在序列化列表后删除其中一个枚举项,则会出错。

所以,我的枚举成了:

public enum Test
{
    item1 = 1,
    item3 = 3
}

我现在在这一行上收到错误。

List<Test> list = JsonConvert.DeserializeObject<List<Test>>(json string);

错误是:

将值“item2”转换为“Test”类型时出错

我怎样才能解决这个问题?

我已经厌倦了添加了以下JsonSetting,但这没有任何区别。

new JsonSerializerSettings
                    {
                        TypeNameHandling = TypeNameHandling.Auto
                    }

2 个答案:

答案 0 :(得分:1)

你可以忽略这种错误(例如我忽略了每一个错误,但你会为你的情况找出它):

var result = JsonConvert.DeserializeObject<List<Test>>(json string, new JsonSerializerSettings
    {
        Error = HandleDeserializationError
    });

public void HandleDeserializationError(object sender, ErrorEventArgs errorArgs)
{
    var currentError = errorArgs.ErrorContext.Error.Message;
    errorArgs.ErrorContext.Handled = true;
}

答案 1 :(得分:0)

这是枚举在C#中的工作方式的一部分,因为枚举是在编译时定义的,并且解串器无法弄清楚&#34; item2&#34;应该。正如彼得所问,如果你没有得到错误会发生什么?

如果您希望您的枚举值经常更改,您可能希望通过使用仅具有命名字符串常量的类来模拟枚举。这将允许你添加/删除枚举值的一些摆动空间,但你仍然需要考虑你的程序如何处理它以前没有遇到过的值!

编辑:看到你的期望,你可以先将你的JSON反序列化为一个字符串数组,然后遍历你的结果和tryParse()每个字符串,将每个有效的结果添加到列表中(或使用linq)