C# JSON反序列化异常排查及枚举序列化、数据提取解决方案
问题解决方案
1. 修复反序列化类型不匹配错误
你生成的JSON是List<Alts>类型的数组,但反序列化时错误尝试转换成List<AltsInfos>,导致类型不匹配抛出异常。正确做法是先反序列化为List<Alts>,再遍历其中的account集合提取目标数据。
修改后的反序列化代码:
using (StreamReader sr = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "BoostyLauncher", "alts.json"))) { string json = sr.ReadToEnd(); // 反序列化为正确的类型:List<Alts> List<Alts> altsList = JsonConvert.DeserializeObject<List<Alts>>(json); // 提取每个account下的alts_name foreach (var alts in altsList) { foreach (var info in alts.account) { Console.WriteLine(info.alts_name); } } }
2. 解决枚举序列化为字符串的问题
要让枚举序列化为EnumMember指定的字符串而非数字,需要在序列化/反序列化时添加StringEnumConverter转换器,并配置JsonSerializerSettings。
修改后的序列化代码:
var json = new List<Alts>(); List<AltsInfos> p1 = new List<AltsInfos> { new AltsInfos { alts_name = "JeSaisPas", alts_email = "truc2fou@g.com", alts_pass = "azerty", alts_type = AltsInfos.AltType.Microsoft } }; json.Add(new Alts { account = p1 }); List<AltsInfos> p2 = new List<AltsInfos> { new AltsInfos { alts_name = "TrucBidule", alts_email = "trucmachun@g.com", alts_pass = "azerty2.0", alts_type = AltsInfos.AltType.Microsoft } }; json.Add(new Alts { account = p2 }); // 添加StringEnumConverter,让枚举序列化为字符串 var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Formatting = Formatting.Indented, Converters = new List<JsonConverter> { new StringEnumConverter() } }; string jsonString = JsonConvert.SerializeObject(json, settings); string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "BoostyLauncher", "alts.json"); // 确保目录存在,避免写入失败 Directory.CreateDirectory(Path.GetDirectoryName(savePath)); File.WriteAllText(savePath, jsonString);
修改后生成的JSON中,alts_type会显示为指定字符串:
[ { "account": [ { "alts_name": "JeSaisPas", "alts_email": "truc2fou@g.com", "alts_pass": "azerty", "alts_type": "Microsoft" } ] }, { "account": [ { "alts_name": "TrucBidule", "alts_email": "trucmachun@g.com", "alts_pass": "azerty2.0", "alts_type": "Microsoft" } ] } ]
额外优化提示
- 使用
Path.Combine拼接路径,避免手动拼接字符串出现的路径分隔符问题 - 写入文件前先创建目标目录,防止因目录不存在抛出异常
内容的提问来源于stack exchange,提问作者HHopter
相关产品推荐
相关产品推荐

