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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:07:22