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

如何给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:15:01