如果已删除枚举项,则将Json反序列化回列表或枚举会导致错误[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果已删除枚举项,则将Json反序列化回列表或枚举会导致错误[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
说我有以下枚举:
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
}
答案
你可以忽略这种错误(例如我忽略了每一个错误,但你会在你的情况下找出它):
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;
}
另一答案
这是枚举在C#中的工作方式的一部分,因为枚举是在编译时定义的,并且反序列化器无法弄清楚应该是什么“item2”。正如彼得所问,如果你没有收到错误会发生什么?
如果您希望枚举值经常更改,则可能需要使用仅具有命名字符串常量的类来模拟枚举。这将允许你添加/删除枚举值的一些摆动空间,但你仍然需要考虑你的程序如何处理它以前没有遇到的值!
编辑:看到你的期望,你可以先将你的JSON反序列化为一个字符串数组,然后遍历你的结果和tryParse()每个字符串,将每个有效的结果添加到列表中(或使用linq)
以上是关于如果已删除枚举项,则将Json反序列化回列表或枚举会导致错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章