如何在C#中用System.Text.Json反序列化至含私有构造函数的不可变类
使用System.Text.Json反序列化至带私有构造函数的不可变类
要实现「只允许通过System.Text.Json反序列化创建不可变类实例、同时隐藏构造函数」的需求,只需给私有构造函数标记**[JsonConstructor]**特性即可。System.Text.Json会识别并优先使用带有该特性的构造函数,无论其访问修饰符是私有还是其他。
实现示例
public class Sheet { public string Id { get; } public IEnumerable<IEnumerable<SheetCell>> Data { get; } [JsonConstructor] private Sheet(string id, IEnumerable<IEnumerable<SheetCell>> data) { Id = id; Data = data; } } // 配套的SheetCell不可变类示例 public class SheetCell { public string Value { get; } [JsonConstructor] private SheetCell(string value) { Value = value; } }
关键注意事项
- 构造函数的参数名称必须与JSON中的属性名称大小写匹配(默认配置下),若需忽略大小写,可在
JsonSerializerOptions中设置PropertyNameCaseInsensitive = true。 - 类的属性需使用只读自动属性(
{ get; }),确保实例创建后状态不可修改,符合不可变类的设计要求。 - 可在私有构造函数中添加参数校验、默认值赋值等逻辑,保证实例的有效性。
内容的提问来源于stack exchange,提问作者Justas Mileika
相关产品推荐
相关产品推荐

