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

C# 如果已删除枚举项,则将Json反序列化回列表或枚举会导致错误,c#,json,serialization,json.net,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<Li

假设我有以下枚举:

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);
我现在在这行上得到一个错误

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

这是枚举在C#中工作的一部分,这是因为枚举是在编译时定义的,而反序列化程序无法确定“item2”应该是什么。正如彼得所问的,如果你没有犯错误,会发生什么

如果希望枚举值经常更改,则可能需要使用仅具有命名字符串常量的类来模拟枚举。这将允许你增加或删除EnUM值的空间,但是你仍然需要考虑你的程序将如何处理它以前没有遇到过的值。p>
编辑:看到您的期望值后,您可以首先将JSON反序列化为字符串数组,然后遍历结果和tryParse()每个字符串,将每个有效结果添加到列表中(或使用linq)

您可以忽略此类错误(在示例中,我忽略每个错误,但您会根据自己的情况解决):

var result=JsonConvert.DeserializeObject(json字符串,新的JsonSerializerSettings
{
Error=HandleDeserializationError
});
public void HandleDeserializationError(对象发送方,ErrorEventArgs errorArgs)
{
var currentError=errorArgs.ErrorContext.Error.Message;
errorArgs.ErrorContext.Handled=true;
}

您希望得到什么结果?我希望忽略包含“item2”和中的两个项目的列表。抱歉,我忘记添加定义中也设置了枚举值。这是对您的编辑的响应,我已经考虑了该选项。这可能是我唯一的选择。
List<Test> list = JsonConvert.DeserializeObject<List<Test>>(json string);
new JsonSerializerSettings
                    {
                        TypeNameHandling = TypeNameHandling.Auto
                    }
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;
}