说我有以下枚举:
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
}
答案 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)