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

序列化JSON对象存入数据库时返回空对象{}问题求助

解决JSON序列化后仅为空对象{}的问题

我碰到过好多类似的情况,序列化后出空对象,基本都是下面这几个常见原因,你可以对照自己的QuoteDataObject代码排查一下:

  • 成员访问权限不够
    默认的JSON序列化器(不管是Newtonsoft.Json还是System.Text.Json)都只能访问public的属性/字段。如果你的QuoteDataObject里的属性都是private或者protected的,序列化器根本看不到这些成员,自然就输出{}了。
    举个反例:

    public class QuoteDataObject
    {
        private string _quoteText;
        private decimal _price;
    }
    

    解决办法很简单,要么把属性改成public并加上get/set:

    public class QuoteDataObject
    {
        public string QuoteText { get; set; }
        public decimal Price { get; set; }
    }
    

    要是不想改访问权限,也可以给私有成员加序列化特性:

    // Newtonsoft.Json用[JsonProperty]
    public class QuoteDataObject
    {
        [JsonProperty]
        private string _quoteText;
        [JsonProperty]
        private decimal _price;
    }
    // System.Text.Json用[JsonInclude]
    public class QuoteDataObject
    {
        [JsonInclude]
        private string _quoteText;
        [JsonInclude]
        private decimal _price;
    }
    
  • 缺少无参数构造函数
    有些序列化器(比如System.Text.Json)要求类必须有公共的无参数构造函数,才能正确实例化并处理序列化逻辑。如果你的QuoteDataObject只有带参数的构造函数,就可能导致序列化失败,输出空对象。
    解决办法:给类加一个无参构造函数就行:

    public class QuoteDataObject
    {
        // 新增无参构造
        public QuoteDataObject() { }
    
        public QuoteDataObject(string quoteText, decimal price)
        {
            QuoteText = quoteText;
            Price = price;
        }
    
        public string QuoteText { get; set; }
        public decimal Price { get; set; }
    }
    
  • 属性没有setter(或init)
    如果你的属性只有getter没有setter,序列化器可能无法正确处理这些成员(尤其是反序列化,但序列化时如果属性没被初始化也会是空)。比如:

    public class QuoteDataObject
    {
        public string QuoteText { get; }
        public decimal Price { get; }
    }
    

    解决办法:给属性加上setter,或者用C# 9+的init setter(适合只读属性的场景):

    public class QuoteDataObject
    {
        public string QuoteText { get; init; }
        public decimal Price { get; init; }
    }
    
  • 序列化配置被误改
    如果你手动配置了序列化器,可能不小心设置了过滤规则,把所有属性都排除了。比如Newtonsoft.Json里错误地设置了忽略某些特性,或者System.Text.Json里配置了IgnoreFields = true但你用的是字段而不是属性。
    解决办法:先试试用默认配置序列化,比如:

    // Newtonsoft.Json
    var json = JsonConvert.SerializeObject(yourQuoteData);
    // System.Text.Json
    var json = JsonSerializer.Serialize(yourQuoteData);
    

    如果默认配置能正常输出,再去检查你自定义的序列化配置哪里出问题了。

要是排查完这些还是不行,你可以把QuoteDataObject的完整代码贴出来,这样能更精准地找到问题所在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:24:37