You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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; // 返回序列化后的字符串
}

修正后的运行流程验证

  1. 创建并修改Cat实例:
    Cat cat = new Cat();
    cat.Color = "White";
    cat.Origin = "Europe";
    
  2. 序列化并写入文件,生成的JSON会包含"Color": "White", "Origin": "Europe"
  3. 反序列化后获取实例,此时输出cat.Origin会得到Europe,cat.Color会得到White,完全符合预期。

内容的提问来源于stack exchange,提问作者abdou93

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:56:18