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

