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

问题描述 投票:0回答:2

这个问题在这里已有答案:

说我有以下枚举:

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
                    }
c# json serialization json.net
2个回答
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;
}

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.