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

如何用System.Text.Json反序列化带Getter的Required属性类?

解决System.Text.Json反序列化含计算型Required属性类的异常问题

问题分析

你的代码中,DerivedClassWithRequired的LinkId是依赖LinkedObject.Id的计算属性,但被标记为required。System.Text.Json反序列化时会严格校验所有required属性:只要JSON中没有对应字段,就会抛出JsonException,哪怕该属性的取值来自其他已完成反序列化的属性。

解决方案

在派生类的LinkId属性上添加[JsonIgnore]特性,让System.Text.Json忽略对该属性的反序列化校验与赋值操作。由于LinkedObject本身是required属性,反序列化完成后它会被正确赋值,LinkId的getter自然能获取到有效数值,满足C#层面的required要求。

修改后的完整代码

namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var jsonString = "{\"LinkedObject\":{\"Id\":123,\"Name\":\"test\"}}";
            var jsonObj = System.Text.Json.JsonSerializer.Deserialize<DerivedClassWithRequired>(jsonString);
        }
    }
    public abstract class BaseClassWithRequired
    {
        public required abstract int LinkId { get; set; }
    }

    public class DerivedClassWithRequired : BaseClassWithRequired
    {
        public required Link LinkedObject { get; set; }
        
        [System.Text.Json.Serialization.JsonIgnore]
        public required override int LinkId { get => LinkedObject.Id; set => _ = value; }
    }

    public class Link
    {
        public required int Id { get; set; }
        public required string Name { get; set; }
    }
}

补充说明

  • [JsonIgnore]仅作用于System.Text.Json的序列化/反序列化流程,不会影响C#编译器对required属性的校验——只要LinkedObject被正确赋值,LinkId就能返回有效数值,符合类的设计要求。
  • 若无法修改属性特性,也可通过自定义JsonConverter手动控制反序列化过程,但上述方法是最简洁直接的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:18:26