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

C# 9记录类型构造函数参数设置Newtonsoft.Json的JsonProperty属性问题

C# 9 记录类型主构造函数参数的Newtonsoft.Json序列化问题解决

你遇到的这个问题其实很常见——C# 9的record主构造函数参数上直接加[JsonProperty]特性时,Newtonsoft.Json并不会识别它,因为这个特性默认是附着在构造函数参数上,而不是编译器自动生成的对应属性上。不过不用退回到显式属性的写法,有个更简便的小技巧就能解决:

技巧:使用特性目标修饰符property:

只需要在[JsonProperty]前面加上property:前缀,就能让编译器把特性应用到自动生成的属性上,而不是参数本身。修改后的代码如下:

using System;
using Newtonsoft.Json;

Console.WriteLine(JsonConvert.SerializeObject(new Something("something")));

record Something([property: JsonProperty("hello")] string world) {}

运行这段代码,输出就会变成你预期的{"hello":"something"}了。

备选方案:显式声明属性(你提到的写法)

如果觉得特性修饰符的写法不够直观,也可以采用你说的显式定义属性和构造函数的方式,这种方式在需要对属性做更多自定义逻辑时更有用:

internal record Something {
    public Something(string world) { World = world; }
    [JsonProperty("hello")] public string World { get; }
}

为什么直接加特性不生效?

简单解释一下背后的原因:C# 9的record主构造函数参数会自动生成对应的公共属性,但默认情况下,你加在参数上的特性只会绑定到参数本身,而序列化框架(比如Newtonsoft.Json)是针对类的属性/字段进行序列化的,自然识别不到参数上的特性。而property:这个修饰符就是告诉编译器:“把这个特性应用到由该参数生成的属性上”,这样序列化框架就能正确读取到JsonProperty的配置了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:28:00