JsonConvert反序列化Cat类返回默认值而非序列化修改值的问题解决方案
问题分析与解决方案
看起来你遇到的问题是反序列化后无法获取序列化时修改的属性值,核心原因是代码里存在几个关键错误,我来一步步帮你解决:
1. 最直接的笔误:反序列化方法返回错误对象
你的Deserialize方法里最后返回的是motor,但你实际反序列化得到的是cat变量!这会导致你拿到的根本不是反序列化后的实例,而是一个未定义的对象(甚至会引发编译错误)。
修正后的反序列化方法:
public Cat Deserialize(string jsonString) { var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }; var cat = JsonConvert.DeserializeObject<Cat>(jsonString, settings); return cat; // 改为返回正确的反序列化实例 }
2. Cat类未正确继承Animal基类
你的代码里Cat类定义是public class Cat {,但注释说明它应该继承自Animal抽象类。如果没有显式继承,基类的Color和Origin属性不属于Cat类,理论上根本无法被序列化到文件中(你说文件里有正确值可能是代码书写时的疏漏)。
修正后的Cat类定义:
public class Cat : Animal // 显式继承Animal { // 实例化时的无参构造函数,设置默认属性值 public Cat() : base(Type.Cat) { this.Origin = "American"; this.Color = "Black"; } // 供反序列化使用的构造函数,标记[JsonConstructor] [JsonConstructor] public Cat() : base(Type.Cat) { } // 无需设置默认值,反序列化会覆盖属性 }
3. JsonConstructor构造函数的参数冗余问题
你标记了[JsonConstructor]的构造函数带有bool Serialize参数,但JSON序列化结果中并没有对应的字段。虽然Json.NET会自动传入默认值false,但这个参数完全没必要,反而可能造成反序列化逻辑的混淆,改成无参构造函数更稳妥。
额外优化:序列化方法的小问题
你的SerializeObj方法定义为void,但调用时却试图赋值给var fileString,这也会引发编译错误。如果需要返回序列化后的JSON字符串,可以修改方法:
public string SerializeObj(Cat cat) { var mysettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, Formatting = Newtonsoft.Json.Formatting.Indented }; var json = JsonConvert.SerializeObject(cat, typeof(Cat), mysettings ); using (StreamWriter stream = new StreamWriter(path)) { stream.WriteLine(json); // using块会自动释放资源,无需手动调用Close() } return json; // 返回序列化后的字符串 }
修正后的运行流程验证
- 创建并修改Cat实例:
Cat cat = new Cat(); cat.Color = "White"; cat.Origin = "Europe"; - 序列化并写入文件,生成的JSON会包含
"Color": "White", "Origin": "Europe" - 反序列化后获取实例,此时输出
cat.Origin会得到Europe,cat.Color会得到White,完全符合预期。
内容的提问来源于stack exchange,提问作者abdou93
相关产品推荐
相关产品推荐

