如何给C# record主构造函数添加[JsonConstructor]属性解决反序列化报错
C# Record 多构造函数下Newtonsoft.Json反序列化解决方案
实现方法
通过显式指定constructor特性目标,将[JsonConstructor]标记到record主构造函数即可,修改后代码如下:
[constructor: JsonConstructor] public record PublishedTestMethod(Guid Id, string Name, int Version, string Status, Guid? Publisher, DateTimeOffset? DatePublished) { public PublishedTestMethod(TestMethod tm) : this(tm.Id, tm.Name, tm.Version, tm.Status, tm.Publisher, tm.DatePublished) { } }
规则说明
- 当record定义了多个构造函数时,Newtonsoft.Json无法自动匹配反序列化使用的构造函数,必须显式标记
- 直接写在record定义上方的特性默认会应用到生成的类本身,不会作用到主构造函数,添加
constructor:前缀可以明确指定特性的应用目标为主构造函数
可选替代方案
如果更偏好显式构造函数的写法,也可以手动写出主构造函数后直接加特性,可读性更高:
public record PublishedTestMethod { public Guid Id { get; init; } public string Name { get; init; } public int Version { get; init; } public string Status { get; init; } public Guid? Publisher { get; init; } public DateTimeOffset? DatePublished { get; init; } [JsonConstructor] public PublishedTestMethod(Guid id, string name, int version, string status, Guid? publisher, DateTimeOffset? datePublished) { Id = id; Name = name; Version = version; Status = status; Publisher = publisher; DatePublished = datePublished; } public PublishedTestMethod(TestMethod tm) : this(tm.Id, tm.Name, tm.Version, tm.Status, tm.Publisher, tm.DatePublished) { } }
内容的提问来源于stack exchange,提问作者Chris Midgley
相关产品推荐
相关产品推荐

