.NET 8中System.Text.Json是否必须提供无参构造函数?
.NET 8 Json反序列化构造函数报错的解决办法
问题根源
你遇到的错误是因为.NET 8里System.Text.Json的反序列化规则变严格了:构造函数的每个参数必须能绑定到类的属性/字段,参数名要和属性名(忽略大小写)对应上。你的MyClass构造函数参数是num、characters,但类属性是Number、Text,小写后num≠number、characters≠text,自然匹配失败。
不用加无参构造函数的解决方法
方案1:修改构造函数参数名匹配属性名
直接把参数名改成和属性名一致(大小写不强制,但要保证忽略大小写后匹配):
public class MyClass { public int Number { get; set; } public string Text { get; set; } public MyClass(int number, string text) { Number = number; Text = text; } }
这种方式最直接,符合序列化器的默认规则,不需要额外配置。
方案2:用特性标记指定参数与属性的映射
如果不想改参数名,给构造函数加[JsonConstructor],同时给每个参数加[JsonPropertyName]指定对应的属性名称:
using System.Text.Json.Serialization; public class MyClass { public int Number { get; set; } public string Text { get; set; } [JsonConstructor] public MyClass([JsonPropertyName("Number")] int num, [JsonPropertyName("Text")] string characters) { Number = num; Text = characters; } }
[JsonConstructor]告诉序列化器优先使用这个构造函数,[JsonPropertyName]明确参数对应的JSON字段(也就是类属性序列化后的名称),这样就能完成绑定。
方案3:全局配置序列化选项(适用于批量场景)
如果有很多类都存在类似问题,可以全局配置JsonSerializerOptions,确保参数和属性的匹配逻辑正确(注意:此方案仅当参数名是属性名的合理缩写、忽略大小写后能匹配时有效,比如number对应Number,你的num和Number不满足该条件,前两个方案更适合):
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, // 默认就是true,确保大小写不敏感匹配 ConstructorHandling = ConstructorHandling.PreferConstructor // 优先使用有参构造函数 }; // 反序列化时传入选项 var o = JsonSerializer.Deserialize<MyClass>(s, options);
内容的提问来源于stack exchange,提问作者phil
相关产品推荐
相关产品推荐

