Newtonsoft.Json反序列化枚举字符串至枚举类型失败的问题求助
Newtonsoft.Json反序列化枚举字符串至枚举类型失败的问题求助
嗨,我看了你的问题,大概率是两个小细节没处理好导致的,咱们一步步来解决:
缺少
System.Runtime.Serialization命名空间引用
你用到了[EnumMember]特性来给枚举值指定字符串映射,但这个特性属于System.Runtime.Serialization命名空间,如果没在代码里引用它,Newtonsoft.Json根本识别不了你设置的"0"/"1"/"2"这些映射值,自然没法把JSON里的字符串转换成对应的枚举类型。解决方法很简单,在
JsonError类的代码顶部加上这行引用:using System.Runtime.Serialization;JsonConverter特性的位置不对
你现在把[JsonConverter(typeof(StringEnumConverter))]加在了嵌套的Number枚举类型上,对于嵌套类里的枚举,Newtonsoft.Json的特性识别偶尔会出问题。更稳妥的做法是把这个特性直接贴在ErrorNumber属性上,明确告诉转换器要处理这个属性:修改后的
JsonError类代码如下:using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System.Runtime.Serialization; // 必须加的命名空间 public class JsonError { public enum Number { [EnumMember(Value = "0")] Pass, [EnumMember(Value = "1")] Miscalc, [EnumMember(Value = "2")] ReadError } [JsonConverter(typeof(StringEnumConverter))] // 移到属性上 public Number ErrorNumber { get; set; } }
另外还有个可选方案:如果你不想给每个属性加特性,也可以在反序列化时全局配置转换器,这样所有枚举类型都会用字符串枚举转换器处理:
var jsonSettings = new JsonSerializerSettings(); jsonSettings.Converters.Add(new StringEnumConverter()); var testBehavior = JsonConvert.DeserializeObject<TestBehavior>(yourJsonString, jsonSettings);
你先试试前两个修改,应该就能解决这个反序列化错误啦!
备注:内容来源于stack exchange,提问作者Thern
相关产品推荐
相关产品推荐

