如何用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
相关产品推荐
相关产品推荐

