反序列化JSON文件时遭遇SerializationException异常求助
问题排查与解决方案
异常原因
你遇到的SerializationException核心原因是JSON数据结构与反序列化目标类型不匹配:
- 你的JSON实际是多个
ServiceEntity对象组成的数组,但当前代码尝试将其反序列化为单个ServiceEntity实例,解析器会把数组中每个对象的同名字段识别为重复数据项,触发异常。 - 另一种可能是JSON单个对象内部存在重复的字段键(比如同一对象内重复定义
ServiceName),但结合你代码中的while循环(意图遍历多个实体),前者的概率更高。
解决方案
1. 调整反序列化目标为集合类型
将反序列化的目标类型从单个ServiceEntity改为List<ServiceEntity>,同时修改调用逻辑为遍历集合:
修改调用代码
List<ServiceEntity> resultEntities = JsonHelper<List<ServiceEntity>>.Deserialize(DestinationFilePath); foreach (var resultEntity in resultEntities) { ListViewItem listViewItem = new ListViewItem(new string[] { resultEntity.ServiceName, resultEntity.ServiceStatus.ToString(), resultEntity.DisplayName }); lvServices.Items.Add(listViewItem); }
2. 修正JSON数据(针对单个对象存在重复字段的情况)
如果你的JSON本该是单个ServiceEntity对象,检查并清理JSON内容,确保每个字段键只出现一次,比如删除重复的"ServiceName"或DisplayName条目。
3. 优化反序列化方法(避免空文件异常)
当前方法使用FileMode.OpenOrCreate会在文件不存在时创建空文件,导致反序列化失败,建议添加文件存在检查并调整文件模式:
public static T Deserialize(string FilePath) { if (!File.Exists(FilePath)) return default(T); using (FileStream FS = new FileStream(FilePath, FileMode.Open)) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); return (T)serializer.ReadObject(FS) ?? default(T); } }
内容的提问来源于stack exchange,提问作者zeroG
相关产品推荐
相关产品推荐

